tnx-shared 5.0.57 → 5.0.59
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/tnx-shared.umd.js +39 -20
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/base/data-form-base.d.ts +2 -2
- package/classes/base/data-form-base.d.ts.map +1 -1
- package/classes/form-schema.d.ts +1 -0
- package/classes/form-schema.d.ts.map +1 -1
- package/classes/public-function.d.ts +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts +2 -2
- package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts.map +1 -1
- package/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.d.ts.map +1 -1
- package/components/mask/mask.component.d.ts +2 -0
- package/components/mask/mask.component.d.ts.map +1 -1
- package/esm2015/classes/base/data-form-base.js +5 -5
- package/esm2015/classes/form-schema.js +2 -1
- package/esm2015/components/crud/crud-form/crud-form.component.js +2 -2
- package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +9 -6
- package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +9 -6
- package/esm2015/components/mask/mask.component.js +8 -4
- package/esm2015/services/common.service.js +9 -1
- package/fesm2015/tnx-shared.js +37 -18
- package/fesm2015/tnx-shared.js.map +1 -1
- package/package.json +2 -2
- package/services/common.service.d.ts +4 -0
- package/services/common.service.d.ts.map +1 -1
- package/tnx-shared.metadata.json +1 -1
|
@@ -1909,7 +1909,7 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1909
1909
|
CrudFormComponent.decorators = [
|
|
1910
1910
|
{ type: Component, args: [{
|
|
1911
1911
|
selector: 'crud-form',
|
|
1912
|
-
template: "<div [class]=\"_styleClass\" style=\"padding: 0.5rem 0.5rem 0\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #labelValueViewMode let-data=\"data\" let-control=\"control\" let-path=\"path\" let-parentPath=\"parentPath\"\r\n let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} type-{{control.dataType}} view-mode\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel && control.label\">\r\n <label [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}<span *ngIf=\"control.required\"\r\n class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container *ngIf=\"data[control.field] === null || data[control.field] === undefined\">\r\n <span class=\"no-value\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(data[control.field] === null || data[control.field] === undefined)\">\r\n <ng-container [ngSwitch]=\"control.dataType\">\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: subControl, data: data[control.field], showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\"\r\n [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\"\r\n [attr.label-index]=\"control.indexLabel\" [pTooltip]=\"control.title\" tooltipPosition=\"top\"\r\n tooltipStyleClass=\"wrap\" [escape]=\"false\" [for]=\"control.for\">{{control.text |\r\n translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'text'\">\r\n {{data[control.field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'money'\">\r\n {{data[control.field] | number}} VN\u0110\r\n </span>\r\n <span *ngSwitchCase=\"'date'\">\r\n {{data[control.field] | date:'dd/MM/yyyy'}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\">\r\n {{_crudService.renderDateTime(data[control.field], control.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\">\r\n {{data[control.field] | userFormat | async}}\r\n </span>\r\n <span *ngSwitchCase=\"'hasDataSource'\">\r\n <span *ngIf=\"!control.freeText\">\r\n {{getItemInArrayByValue(data._source[control.field] || control.dataSource,\r\n data[control.field], control)}}\r\n </span>\r\n <span *ngIf=\"control.freeText\">\r\n {{getItemInArrayByTextValue(data._source[control.field] || control.dataSource,\r\n data[control.field])}}\r\n </span>\r\n </span>\r\n <span *ngSwitchCase=\"'colorPicker'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.field]}\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.sourceField]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.sourceField]\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'colorControl'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\">\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <i class=\"{{data[control.field] | booleanFormat}}\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div [innerHTML]=\"data[control.field]\" *ngIf=\"data[control.field]==null?'':data[control.field]\">\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"'mask'\">\r\n <tn-mask [viewMode]=\"true\" [prefix]=\"control.prefix\" [suffix]=\"control.suffix\"\r\n [disabled]=\"checkDisabled(data, control)\" [decimalPlaces]=\"control.decimalPlaces\"\r\n [maskType]=\"control.maskType\" [(ngModel)]=\"data[control.field]\" [min]=\"control.min\"\r\n [max]=\"control.max\">\r\n </tn-mask>\r\n </span>\r\n <span *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [viewMode]=\"true\"\r\n [(data)]=\"data[control.field]\">\r\n </address-picker>\r\n </span>\r\n <span *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\">\r\n </tn-number-picker-range>\r\n </span>\r\n <span *ngSwitchCase=\"'string'\">{{data[control.field]}}</span>\r\n <span *ngSwitchCase=\"'button'\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\"\r\n [responsive]=\"true\" class=\"new-table scr-table table-control\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\"\r\n tooltipPosition=\"top\" [style.width]=\"subControl.width\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr>\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n class=\"control-inside\" [style]=\"subControl.style\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.viewModedataType)\"\r\n [ngTemplateOutletContext]=\"{data: data, control: control, isViewMode: true}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText type=\"tel\" [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n type=\"tel\" pInputText [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.checkboxLabel ? control.checkboxLabel : control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [parentPath]=\"parentPath\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n class=\"new-table scr-table table-control\" [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n [style.width]=\"subControl.width\" style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"getTableFunctionColumnWidth(control)\"\r\n class=\"table-function column-function\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align:center\" *ngIf=\"control.showFunction\" class=\"column-function\">\r\n <div class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\"\r\n [ngTemplateOutletContext]=\"{crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>\r\n",
|
|
1912
|
+
template: "<div [class]=\"_styleClass\" style=\"padding: 0.5rem 0.5rem 0\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #labelValueViewMode let-data=\"data\" let-control=\"control\" let-path=\"path\" let-parentPath=\"parentPath\"\r\n let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} type-{{control.dataType}} view-mode\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel && control.label\">\r\n <label [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}<span *ngIf=\"control.required\"\r\n class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container *ngIf=\"data[control.field] === null || data[control.field] === undefined\">\r\n <span class=\"no-value\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(data[control.field] === null || data[control.field] === undefined)\">\r\n <ng-container [ngSwitch]=\"control.dataType\">\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: subControl, data: data[control.field], showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\"\r\n [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\"\r\n [attr.label-index]=\"control.indexLabel\" [pTooltip]=\"control.title\" tooltipPosition=\"top\"\r\n tooltipStyleClass=\"wrap\" [escape]=\"false\" [for]=\"control.for\">{{control.text |\r\n translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'text'\">\r\n {{data[control.field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'money'\">\r\n {{data[control.field] | number}} VN\u0110\r\n </span>\r\n <span *ngSwitchCase=\"'date'\">\r\n {{data[control.field] | date:'dd/MM/yyyy'}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\">\r\n {{_crudService.renderDateTime(data[control.field], control.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\">\r\n {{data[control.field] | userFormat | async}}\r\n </span>\r\n <span *ngSwitchCase=\"'hasDataSource'\">\r\n <span *ngIf=\"!control.freeText\">\r\n {{getItemInArrayByValue(data._source[control.field] || control.dataSource,\r\n data[control.field], control)}}\r\n </span>\r\n <span *ngIf=\"control.freeText\">\r\n {{getItemInArrayByTextValue(data._source[control.field] || control.dataSource,\r\n data[control.field])}}\r\n </span>\r\n </span>\r\n <span *ngSwitchCase=\"'colorPicker'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.field]}\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.sourceField]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.sourceField]\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'colorControl'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\">\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <i class=\"{{data[control.field] | booleanFormat}}\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div [innerHTML]=\"data[control.field]\" *ngIf=\"data[control.field]==null?'':data[control.field]\">\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"'mask'\">\r\n <tn-mask [viewMode]=\"true\" [prefix]=\"control.prefix\" [suffix]=\"control.suffix\"\r\n [disabled]=\"checkDisabled(data, control)\" [decimalPlaces]=\"control.decimalPlaces\"\r\n [maskType]=\"control.maskType\" [thousandSeperator]=\"control.thousandSeperator\" [(ngModel)]=\"data[control.field]\" [min]=\"control.min\"\r\n [max]=\"control.max\">\r\n </tn-mask>\r\n </span>\r\n <span *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [viewMode]=\"true\"\r\n [(data)]=\"data[control.field]\">\r\n </address-picker>\r\n </span>\r\n <span *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\">\r\n </tn-number-picker-range>\r\n </span>\r\n <span *ngSwitchCase=\"'string'\">{{data[control.field]}}</span>\r\n <span *ngSwitchCase=\"'button'\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\"\r\n [responsive]=\"true\" class=\"new-table scr-table table-control\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\"\r\n tooltipPosition=\"top\" [style.width]=\"subControl.width\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr>\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n class=\"control-inside\" [style]=\"subControl.style\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.viewModedataType)\"\r\n [ngTemplateOutletContext]=\"{data: data, control: control, isViewMode: true}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\" [thousandSeperator]=\"control.thousandSeperator\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText type=\"tel\" [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n type=\"tel\" pInputText [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.checkboxLabel ? control.checkboxLabel : control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [parentPath]=\"parentPath\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n class=\"new-table scr-table table-control\" [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n [style.width]=\"subControl.width\" style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"getTableFunctionColumnWidth(control)\"\r\n class=\"table-function column-function\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align:center\" *ngIf=\"control.showFunction\" class=\"column-function\">\r\n <div class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\"\r\n [ngTemplateOutletContext]=\"{crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>\r\n",
|
|
1913
1913
|
providers: [ComponentContextService],
|
|
1914
1914
|
styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{color:red;padding-left:.2em;padding-top:.3em;position:absolute}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;color:#495057;display:flex;font-weight:600;padding:.5em}::ng-deep .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control){padding:0}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-size:.85em;font-weight:700}.view-mode>span:not(:empty){display:inline-block;padding:5px 0;width:100%}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{border-bottom:1px solid #cfcfcf;color:#025ba7;font-size:1.2rem;font-weight:700;padding:10px 0 10px 5px;text-transform:uppercase}.crud-form-control.type-title>.label{margin-bottom:0}.control-description{color:#6c757d;font-size:.8rem;margin-bottom:5px;margin-left:10px}::ng-deep .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep .crud-form-control>div.label{font-size:.9em;height:1.15em;margin-bottom:5px}::ng-deep .crud-form-control>div.label+*{width:100%}::ng-deep .crud-form-control>.error-container .error-item{animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{animation:fadeIn .1s;color:red;display:flex;font-size:.9em;position:relative}::ng-deep .crud-form-control>.error-container .error-item .error-content i{display:flex;font-size:.9em;padding-top:1px}::ng-deep .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep .crud-form-control.no-label>div.label{display:none}::ng-deep .crud-form-control.error .p-dropdown,::ng-deep .crud-form-control.error .p-inputtext,::ng-deep .crud-form-control.error .p-multiselect,::ng-deep .crud-form-control.error .tn-dropdown,::ng-deep .crud-form-control.error input,::ng-deep .crud-form-control.error select,::ng-deep .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-delay:0s,0s;transition-duration:.3s,.3s;transition-property:box-shadow,border-color;transition-timing-function:ease,ease}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}.no-value{font-size:.8em}:host ::ng-deep .table-schema-paging{display:block;margin-bottom:40px}"]
|
|
1915
1915
|
},] }
|
|
@@ -2155,4 +2155,4 @@ export class ControlTreeNode {
|
|
|
2155
2155
|
}
|
|
2156
2156
|
}
|
|
2157
2157
|
}
|
|
2158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDWSxTQUFTLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFDNUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUNwRCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0gsb0JBQW9CLEVBQUUseUJBQXlCLEVBQUUsK0JBQStCLEVBQ2hGLG1CQUFtQixFQUFFLHFCQUFxQixFQUMxQyx5QkFBeUIsRUFBRSx3QkFBd0IsRUFDbkQsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFDM0kscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQ3hILFNBQVMsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFDNUQsY0FBYyxFQUVkLHFCQUFxQixFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsK0JBQStCLEVBQzFILFNBQVMsRUFDVCw0QkFBNEIsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQ2xKLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFDM0YsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2UyxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxxQkFBcUI7QUFDckIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUl2QixNQUFNLGdCQUFnQixHQUFHO0lBQ3JCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLO0lBQ2xDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxDQUFDLGNBQWM7SUFDcEQsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU87SUFDbEMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtDQUN2RCxDQUFDO0FBUUYsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGFBQWE7SUFtSGhELFlBQ1csU0FBbUIsRUFDbkIsY0FBNkIsRUFDN0IsWUFBeUIsRUFDeEIsaUJBQW1DLEVBQ3BDLHNCQUE2QyxFQUM1QyxnQkFBaUMsRUFDbEMsVUFBd0IsRUFDeEIsb0JBQXlDLEVBQ3hDLGFBQWtDO1FBRTFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQVZWLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBQzVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN4Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQXZIckMsWUFBTyxHQUFvQixJQUFJLGVBQWUsRUFBRSxDQUFDO1FBR2pELGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLGdCQUFXLEdBQUcsU0FBUyxDQUFDO1FBT2YsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUE4Q2hCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN0QyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekMsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUM1QyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMsYUFBUSxHQUE0QixJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ2xFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUluRCxlQUFVLEdBQVEsRUFBRSxDQUFDO1FBQ3JCLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUNyQyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQixtQ0FBbUM7UUFDbkMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLHlCQUFvQixHQUFRLEVBQUUsQ0FBQztRQUMvQixlQUFVLEdBQVEsRUFBRSxDQUFDO1FBRXJCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGNBQVMsR0FBd0MsRUFBRSxDQUFDO1FBQ3BELHdCQUFtQixHQUFHLGVBQWUsQ0FBQztRQUV0QyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0Qix1QkFBa0IsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakUsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFFeEIsb0JBQWUsR0FBcUIsRUFBRSxDQUFDO1FBQ3ZDLHlCQUFvQixHQUFRLEVBQUUsQ0FBQztRQUUvQixtQkFBYyxHQUFlLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUFRLEVBQUUsQ0FBQztRQUN6QiwwQkFBcUIsR0FBcUIsRUFBRSxDQUFDO1FBQzdDLGdCQUFXLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLHFCQUFnQixHQUFHLGFBQWEsQ0FBQztRQXU5QmpDOztXQUVHO1FBQ0ksMkJBQXNCLEdBQUcsQ0FBTyxPQUF3QixFQUFFLEtBQU0sRUFBRSxTQUFVLEVBQUUsV0FBWSxFQUFFLFVBQVcsRUFBRSxVQUFXLEVBQUUsTUFBTyxFQUFFLEVBQUU7WUFDcEksSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUQsSUFBSSxXQUFXLENBQUM7WUFFaEIsZUFBZTtZQUNmLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtnQkFDakIsV0FBVyxHQUFHLFVBQVUsQ0FBQztnQkFDekIsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQzlCLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO2dCQUNuQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUNsQztpQkFDSTtnQkFDRCxXQUFXLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEQ7WUFDRCxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBRTlCLHFCQUFxQjtZQUNyQixLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QyxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUUxQixpQkFBaUI7WUFDakIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWpDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFDM0I7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQztnQkFDNUIsV0FBVztnQkFDWCxXQUFXLEVBQUUsS0FBSztnQkFDbEIsVUFBVSxFQUFFLFVBQVUsSUFBSSxXQUFXO2dCQUNyQyxTQUFTO2dCQUNULFFBQVEsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FBQztZQUVILElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsSUFBSTtvQkFDQSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3RDO2dCQUNELFdBQU0sR0FBRzthQUNaO1lBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDVCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUMzQjtZQUVELElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFO2dCQUMvRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsSUFBSSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDcEs7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUMvQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDLENBQUMsQ0FBQzthQUNOO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFBLENBQUE7UUEwSUQsNEJBQXVCLEdBQUcsR0FBRyxFQUFFO1lBQzNCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFBO1FBRUQscUVBQXFFO1FBQ3JFLHFCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUE7UUFycENHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXBELDBCQUEwQjtRQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsRSxJQUFJLFFBQVEsRUFBRTtnQkFDVixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO2FBQ25EO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBNUhELElBQWEsVUFBVSxDQUFDLEtBQWE7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDN0IsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1NBQ25DO0lBQ0wsQ0FBQztJQUtELElBQWEsSUFBSSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLEtBQUssSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNuRDtZQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBQ3hCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDM0IsU0FBUyxFQUFFLGNBQWM7Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3hCO1NBQ0o7YUFDSSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDckIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDbkQ7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpDLE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDO2dCQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQzNCLFNBQVMsRUFBRSxjQUFjO2dCQUN6QixRQUFRLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuQzthQUNJO1lBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFBQSxDQUFDO0lBeUVGLFFBQVE7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNwQixJQUFJLHVCQUF1QixDQUFDO2dCQUN4QixLQUFLLEVBQUUsYUFBYTtnQkFDcEIsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLGNBQWMsQ0FBQyxtQkFBbUI7Z0JBQ3hDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtvQkFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0JBQzlCLENBQUM7YUFDSixDQUFDLENBQ0wsQ0FBQztTQUNMO1FBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxjQUFjLENBQUMsWUFBWSxHQUFHLElBQUk7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQUs7UUFDcEIsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUU7Z0JBQ3JCLElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRTtvQkFDbEIsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3hCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7cUJBQzdCO2lCQUNKO2dCQUNELElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRTtvQkFDbEIsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3hCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7cUJBQ3RCO2lCQUNKO3FCQUNJO29CQUNELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQy9CO2FBQ0o7U0FDSjthQUNJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO2dCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pCO1NBQ0o7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQUs7UUFDekIsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsY0FBYyxLQUFLLEVBQUUsRUFBRTtnQkFDN0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4RDtZQUVELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtnQkFDckIsSUFBSSxHQUFHLElBQUksU0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRTtvQkFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO3dCQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7cUJBQ3JCO2lCQUNKO2FBQ0o7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNmO2FBQ0ksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3hDO1lBQ0QsT0FBTyxHQUFHLENBQUM7U0FDZDthQUNJLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUNwQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxRQUFRO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ2pDLGtGQUFrRjtZQUNsRixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO29CQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQzNCLFNBQVMsRUFBRSxXQUFXO29CQUN0QixRQUFRLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLGtGQUFrRjtRQUNsRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDM0IsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFVBQVU7UUFDZCxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQztRQUVELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVztRQUN0RCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLFVBQVUsSUFBSSxJQUFJO1lBQUUsV0FBVyxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBRXJFLElBQUksT0FBTyxZQUFZLFdBQVcsRUFBRTtZQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtnQkFDL0UsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDbkM7WUFDRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3pFLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDMUQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDaEQsbURBQW1EO2dCQUNuRCxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzVELENBQUMsQ0FBQyxDQUFDO2FBQ047WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzNDLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtvQkFDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsV0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7aUJBQ3hFO2dCQUNELENBQUMsRUFBRSxDQUFDO2FBQ1A7U0FDSjthQUNJLElBQUksT0FBTyxZQUFZLGVBQWUsRUFBRTtZQUN6QyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDcEYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDbkM7WUFFRCxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUM5RTtTQUNKO1FBQ0QsU0FBUztRQUNULG9GQUFvRjtRQUNwRixnRUFBZ0U7UUFDaEUsV0FBVztRQUNYLElBQUk7SUFDUixDQUFDO0lBRUQsbUNBQW1DO1FBQy9CLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDdkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDMUQ7SUFDTCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxVQUFXO1FBQzdELElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRCxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2hDLElBQUksVUFBVSxJQUFJLElBQUk7WUFBRSxXQUFXLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUM7UUFFckUsSUFBSSxPQUFPLFlBQVksV0FBVyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFO2dCQUMvRSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNuQztZQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDekUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUMxRCxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMzQyxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7b0JBQzFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2lCQUMvRTtnQkFDRCxDQUFDLEVBQUUsQ0FBQzthQUNQO1NBQ0o7YUFDSSxJQUFJLE9BQU8sWUFBWSxlQUFlLEVBQUU7WUFDekMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BGLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ25DO1lBRUQsS0FBSyxNQUFNLFVBQVUsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDckY7U0FDSjthQUNJO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNyRSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7b0JBQ3RCLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztpQkFDckQ7cUJBQ0ksSUFBSSxPQUFPLFlBQVkscUJBQXFCLEVBQUU7b0JBQy9DLElBQUksT0FBTyxDQUFDLGdCQUFnQjsyQkFDckIsT0FBTyxDQUFDLFVBQVU7MkJBQ2xCLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9COzJCQUN2QyxPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3JEO3dCQUNFLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNuRztpQkFDSjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLFdBQVcsRUFBRSxLQUFLO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLFdBQVcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRW5ELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLFdBQVcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLFdBQVcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRW5ELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JFLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFzQixFQUFFLFFBQVM7UUFDdkQsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUNELElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbkMsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxNQUFNLFlBQVksV0FBVztlQUMxQixNQUFNLFlBQVksV0FBVyxFQUNsQztZQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO2dCQUNmLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUM3QztTQUNKO1FBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN2QixJQUFJLFFBQVEsSUFBSSxJQUFJO2dCQUFFLEdBQUcsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNqRCxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztTQUNuQztRQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEQsSUFBSSxNQUFNLFlBQVksV0FBVyxFQUFFO1lBQy9CLE1BQU0sT0FBTyxHQUFnQixNQUFNLENBQUM7WUFDcEMsS0FBSyxNQUFNLFVBQVUsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDMUQ7U0FDSjthQUNJLElBQUksTUFBTSxZQUFZLHFCQUFxQixFQUFFO1lBQzlDLE1BQU0scUJBQXFCLEdBQTBCLE1BQU0sQ0FBQztZQUM1RCxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBQzVDLHFCQUFxQixDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUNqRCxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxFQUFFO2dCQUN2QyxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQzNDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDMUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUN4QztZQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0M7YUFDSSxJQUFJLE1BQU0sWUFBWSx1QkFBdUIsRUFBRTtZQUNoRCxNQUFNLHVCQUF1QixHQUEwQixNQUFNLENBQUM7WUFDOUQsdUJBQXVCLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztZQUM5QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNDO2FBQ0ksSUFBSSxNQUFNLFlBQVksZUFBZSxFQUFFO1lBQ3hDLE1BQU0sT0FBTyxHQUFvQixNQUFNLENBQUM7WUFDeEMsS0FBSyxNQUFNLFVBQVUsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDM0Q7U0FDSjthQUNJLElBQUksTUFBTSxZQUFZLCtCQUErQixFQUFFO1lBQ3hELE1BQU0seUJBQXlCLEdBQW9DLE1BQU0sQ0FBQztZQUMxRSx5QkFBeUIsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBQ2hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0M7YUFDSSxJQUFJLE1BQU0sWUFBWSxvQkFBb0IsRUFBRTtZQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNDO2FBQ0ksSUFBSSxNQUFNLFlBQVksNEJBQTRCLEVBQUU7WUFDckQsTUFBTSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztTQUNyQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxNQUFXO1FBQ3hDLElBQUksTUFBTSxZQUFZLFdBQVcsRUFBRTtZQUMvQixNQUFNLE9BQU8sR0FBZ0IsTUFBTSxDQUFDO1lBQ3BDLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzdDO1NBQ0o7YUFDSSxJQUFJLE1BQU0sWUFBWSxxQkFBcUIsRUFBRTtZQUM5QyxNQUFNLHFCQUFxQixHQUEwQixNQUFNLENBQUM7WUFDNUQsSUFBSSxxQkFBcUIsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2FBQ3REO1NBQ0o7YUFDSSxJQUFJLE1BQU0sWUFBWSwrQkFBK0IsRUFBRTtZQUN4RCxNQUFNLHFCQUFxQixHQUFvQyxNQUFNLENBQUM7WUFDdEUsSUFBSSxxQkFBcUIsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2FBQ3REO1NBQ0o7YUFDSSxJQUFJLE1BQU0sWUFBWSxlQUFlLEVBQUU7WUFDeEMsTUFBTSxPQUFPLEdBQW9CLE1BQU0sQ0FBQztZQUN4QyxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM3QztTQUNKO0lBQ0wsQ0FBQztJQUVhLHNCQUFzQixDQUFDLHFCQUE4RTs7WUFDL0csSUFBSSxVQUFVLEdBQWEsRUFBRSxDQUFDO1lBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDckQsVUFBVSxHQUFHLHFCQUFxQixDQUFDLGNBQWMsQ0FBQzthQUNyRDtpQkFDSSxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxVQUFVLEVBQUU7Z0JBQ2xFLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN2RDtpQkFDSTtnQkFDRCxVQUFVLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxjQUFjLENBQUM7YUFDM0Q7WUFDRCxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN4QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7dUJBQ2IsQ0FBQyxNQUFNLFlBQVkscUJBQXFCLElBQUksTUFBTSxZQUFZLCtCQUErQixDQUFDLEVBQUU7b0JBQ25HLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztpQkFDdkM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsK0JBQStCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNGLENBQUM7S0FBQTtJQUVPLCtCQUErQixDQUFDLGFBQXNFLEVBQUUsVUFBb0IsRUFBRSxhQUFhO1FBQy9JLElBQUksVUFBVSxZQUFZLEtBQUssRUFBRTtZQUM3QixLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRTtnQkFDN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxjQUFjLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQy9DLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFnQixFQUFFLEVBQUU7d0JBQzNELElBQUksYUFBYSxZQUFZLHFCQUFxQixFQUFFOzRCQUNoRCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7NEJBQ3hCLElBQUksYUFBYSxDQUFDLDJCQUEyQjttQ0FDdEMsS0FBSyxDQUFDLFNBQVMsSUFBSSxhQUFhLEVBQUU7Z0NBQ3JDLFdBQVcsR0FBRyxJQUFJLENBQUM7NkJBQ3RCO2lDQUNJLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJO21DQUNyQixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7bUNBQ2pCLENBQUMsS0FBSyxDQUFDLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0NBQzlELElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRTtvQ0FDMUIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQ0FDM0M7NkJBQ0o7aUNBQ0k7Z0NBQ0QsV0FBVyxHQUFHLElBQUksQ0FBQzs2QkFDdEI7NEJBQ0QsSUFBSSxXQUFXLEVBQUU7Z0NBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBQ3hHLElBQUksYUFBYSxDQUFDLFVBQVU7dUNBQ3JCLENBQUMsQ0FBQyxDQUFDLGNBQWMsWUFBWSxxQkFBcUIsQ0FBQzsyQ0FDL0MsY0FBYyxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUNqRixFQUNIO29DQUNFLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lDQUM3Qzs2QkFDSjt5QkFDSjs2QkFDSTs0QkFDRCxJQUFJLGFBQWEsQ0FBQyxVQUFVLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUU7Z0NBQzlELGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7NkJBQ3RDO3lCQUNKO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2dCQUNELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN0RjtTQUNKO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQXdCLEVBQUUsV0FBVztRQUM5RCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyRCxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsQ0FBTyxLQUFnQixFQUFFLEVBQUU7Z0JBQ2xELE1BQU0sbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQSxDQUFDO1NBQ0w7YUFDSTtZQUNELE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxDQUFPLEtBQWdCLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFBLENBQUM7U0FDTDtRQUNELE1BQU0sbUJBQW1CLEdBQUcsYUFBYSxDQUFDO1FBQzFDLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzVDLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUMzQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQU8sS0FBZ0IsRUFBRSxFQUFFO29CQUMzQyxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDekIsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFDLENBQUMsQ0FBQSxDQUFDO2FBQ0w7aUJBQ0k7Z0JBQ0QsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzdDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUN2QztTQUNKO2FBQ0k7WUFDRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO2dCQUM5QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDakQsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFPLEtBQWdCLEVBQUUsRUFBRTtvQkFDM0MsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pCLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxDQUFDLENBQUEsQ0FBQzthQUNMO2lCQUNJO2dCQUNELE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO2FBQ2hEO1NBQ0o7UUFFRCxJQUFJLE9BQU8sWUFBWSxxQkFBcUIsRUFBRTtZQUMxQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7Z0JBQ3pCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsQ0FBTyxLQUFnQixFQUFFLEVBQUU7b0JBQ2pELE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0QixNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsQ0FBQyxDQUFBLENBQUM7YUFDTDtpQkFDSTtnQkFDRCxPQUFPLENBQUMsZUFBZSxHQUFHLENBQU8sS0FBZ0IsRUFBRSxFQUFFO29CQUNqRCxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsQ0FBQyxDQUFBLENBQUM7YUFDTDtTQUNKO0lBQ0wsQ0FBQztJQUVPLHlCQUF5QixDQUFDLE1BQXVCO1FBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRS9DLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRS9DLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLGlCQUFpQixFQUFFLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksTUFBTSxZQUFZLGlCQUFpQixFQUFFO1lBQ3JDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2xDLElBQUksU0FBUyxZQUFZLHNCQUFzQixFQUFFO3dCQUM3QyxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO3FCQUN4RDtnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7YUFDSSxJQUFJLE1BQU0sWUFBWSxpQkFBaUIsRUFBRTtZQUMxQyxNQUFNLFVBQVUsR0FBdUIsTUFBTyxDQUFDO1lBQy9DLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxRQUFRLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxRQUFRLEVBQUU7Z0JBQ3hFLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO2FBQ3pEO2lCQUNJLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxPQUFPLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxVQUFVLEVBQUU7YUFFakY7aUJBQ0ksSUFBSSxVQUFVLENBQUMsVUFBVSxJQUFJLE9BQU8sRUFBRTtnQkFDdkMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUVqRCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVU7b0JBQUUsVUFBVSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZELFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFDakQsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxDQUFDO2FBQ3BEO2lCQUNJLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxPQUFPLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLEVBQUU7Z0JBQ3pFLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO2FBQzFEO1lBRUQsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUN2QixVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDdEMsSUFBSSxTQUFTLFlBQVksc0JBQXNCLEVBQUU7d0JBQzdDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7cUJBQzVEO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2FBQ047U0FDSjthQUNJLElBQUksTUFBTSxZQUFZLFdBQVcsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBZ0IsTUFBTSxDQUFDO1lBQ3BDLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzlDO1NBQ0o7YUFDSSxJQUFJLE1BQU0sWUFBWSxxQkFBcUIsRUFBRTtZQUM5QyxNQUFNLGNBQWMsR0FBMkIsTUFBTyxDQUFDO1lBQ3ZELElBQUksY0FBYyxDQUFDLFVBQVUsRUFBRTtnQkFDM0IsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQzFDLElBQUksU0FBUyxZQUFZLG9CQUFvQixFQUFFO3dCQUMzQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO3FCQUNoRTtnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7YUFDSSxJQUFJLE1BQU0sWUFBWSxlQUFlLEVBQUU7WUFDeEMsTUFBTSxPQUFPLEdBQW9CLE1BQU0sQ0FBQztZQUN4QyxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM5QztTQUNKO1FBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxTQUFTLFlBQVksdUJBQXVCLEVBQUU7Z0JBQzlDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN0RDtpQkFDSSxJQUFJLFNBQVMsWUFBWSw2QkFBNkIsRUFBRTtnQkFDekQsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2FBQ3RHO2lCQUNJLElBQUksU0FBUyxZQUFZLHVCQUF1QixFQUFFO2dCQUNuRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2FBQ2hHO2lCQUNJLElBQUksU0FBUyxZQUFZLGtCQUFrQixFQUFFO2dCQUM5QyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzthQUM3RjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDRCQUE0QixDQUN4QixTQUF3RCxFQUN4RCxNQUFxRTtRQUVyRSxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztRQUN4RCxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksa0JBQWtCLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQy9EO2FBQ0k7WUFDRCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN2RCxNQUFNLGFBQWEsR0FBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUMvRSxJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsQ0FBQzthQUMvRDtpQkFDSTtnQkFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksZ0JBQWdCO3VCQUM5RCxDQUFDLENBQUMsa0JBQWtCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNoRCxJQUFJLFNBQVMsWUFBWSxvQkFBb0IsRUFBRTt3QkFDM0MsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztxQkFDbEg7eUJBQ0k7d0JBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztxQkFDcEg7aUJBQ0o7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVELDZCQUE2QixDQUFDLE1BQXVCLEVBQUUsVUFBb0IsRUFBRSxPQUFlO1FBQ3hGLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQy9EO2FBQ0k7WUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixNQUFNLFdBQVcsR0FBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksNkJBQTZCO3VCQUN6RSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxFQUN4RTtvQkFDRSxNQUFNLFVBQVUsR0FBRyxJQUFJLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDekUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNwRCxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDM0M7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELHdCQUF3QixDQUFDLE1BQXVCLEVBQUUsVUFBb0IsRUFBRSxPQUFlO1FBQ25GLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQy9EO2FBQ0k7WUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixNQUFNLFdBQVcsR0FBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksdUJBQXVCO3VCQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxFQUN2RTtvQkFDRSxNQUFNLFVBQVUsR0FBRyxJQUFJLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDbkUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzNDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxNQUF1QixFQUFFLFVBQW9CLEVBQUUsT0FBZTtRQUNwRixJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUMvRDthQUNJO1lBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxXQUFXLEdBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLGtCQUFrQjt1QkFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQ25FO29CQUNFLE1BQU0sVUFBVSxHQUFHLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUM5RCxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDM0M7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVPLGNBQWM7UUFDbEIsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5RixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDO1FBQzVGLElBQUksaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEQsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDcEMsSUFBSSxJQUFJLFlBQVkscUJBQXFCLEVBQUU7b0JBQ3ZDLE1BQU0sT0FBTyxHQUEyQixJQUFLLENBQUM7b0JBQzlDLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUNyRixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNCLElBQUksS0FBSyxFQUFFO3dCQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztxQkFDMUM7eUJBQ0ksSUFBSSxxQkFBcUIsRUFBRSxFQUFFLDZCQUE2Qjt3QkFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzlELElBQUksZ0JBQWdCLEVBQUU7NEJBQ2xCLE1BQU0sR0FBRyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzs0QkFDeEYsS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdkIsSUFBSSxLQUFLLEVBQUU7Z0NBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDOzZCQUMxQzt5QkFDSjtxQkFDSjtpQkFDSjtxQkFDSTtvQkFDRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQWtCLElBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxLQUFLLEVBQUU7d0JBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBa0IsSUFBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztxQkFDekQ7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtZQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEU7SUFDTCxDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQUssRUFBRSxnQkFBaUIsRUFBRSxJQUFLO1FBQ3pELEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFO1lBQ3ZCLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxTQUFTLEVBQUU7Z0JBQ2hFLElBQUksbUJBQW1CLENBQUM7Z0JBQ3hCLElBQUksZ0JBQWdCLElBQUksSUFBSSxJQUFJLGdCQUFnQixLQUFLLEVBQUU7b0JBQUUsbUJBQW1CLEdBQUcsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQzs7b0JBQ3pHLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsT0FBTztvQkFBRSxTQUFTO2dCQUN2QixJQUFJLE9BQU8sQ0FBQztnQkFDWixJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUU7b0JBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDOztvQkFDekQsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFFckIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixJQUFJLFFBQVEsWUFBWSxLQUFLLEVBQUU7b0JBQzNCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztvQkFDZCxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRTt3QkFDekIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDbkYsS0FBSyxFQUFFLENBQUM7cUJBQ1g7aUJBQ0o7cUJBQ0ksSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ3RFO3FCQUNJLElBQUksT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDekUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzdDO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFTywwQkFBMEI7UUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxZQUFZLEVBQUU7WUFDZCxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFDbkMsTUFBTTtpQkFDVDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU8sd0JBQXdCO1FBQzVCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxZQUFZO1lBQUUsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNyQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO2dCQUMvQixPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ25DLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLE1BQU07YUFDVDtTQUNKO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNiLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ2QsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWTthQUM1QixDQUFDLENBQUM7U0FDTjtRQUVELFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsYUFBYSxDQUFDLFNBQVM7UUFDbkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLE9BQU8sSUFBSSxXQUFXLEVBQUU7WUFDeEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQy9HO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDWCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFO2dCQUNuRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDekIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUMzRCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDWDtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxPQUFZO1FBQzlCLElBQUksT0FBTyxZQUFZLFdBQVc7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNuRCxJQUFJLE9BQU8sWUFBWSxXQUFXO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDbkQsSUFBSSxPQUFPLFlBQVksaUJBQWlCO1lBQUUsT0FBTyxhQUFhLENBQUM7UUFDL0QsSUFBSSxPQUFPLFlBQVksaUJBQWlCO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDeEQsSUFBSSxPQUFPLFlBQVksd0JBQXdCO1lBQUUsT0FBTyxhQUFhLENBQUM7UUFDdEUsSUFBSSxPQUFPLFlBQVksaUJBQWlCLEVBQUU7WUFDdEMsTUFBTSxXQUFXLEdBQXNCLE9BQU8sQ0FBQztZQUMvQyxJQUNJLFdBQVcsQ0FBQyxVQUFVLEtBQUssT0FBTzttQkFDL0IsV0FBVyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQzFDO2dCQUNFLE9BQU8sT0FBTyxDQUFDO2FBQ2xCO1lBQ0QsSUFDSSxXQUFXLENBQUMsVUFBVSxLQUFLLE9BQU87bUJBQy9CLFdBQVcsQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUNyQztnQkFDRSxPQUFPLFlBQVksQ0FBQzthQUN2QjtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO1FBQ0QsSUFBSSxPQUFPLFlBQVkscUJBQXFCO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDaEUsSUFBSSxPQUFPLFlBQVkscUJBQXFCO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDaEUsSUFBSSxPQUFPLFlBQVksMEJBQTBCO1lBQUUsT0FBTyxlQUFlLENBQUM7UUFDMUUsSUFBSSxPQUFPLFlBQVksb0JBQW9CO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDOUQsSUFBSSxPQUFPLFlBQVkscUJBQXFCO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDaEUsSUFBSSxPQUFPLFlBQVksbUJBQW1CO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDNUQsSUFBSSxPQUFPLFlBQVkscUJBQXFCO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDaEUsSUFBSSxPQUFPLFlBQVksdUJBQXVCLEVBQUU7WUFDNUMsT0FBTyxlQUFlLENBQUM7U0FDMUI7UUFDRCxvSEFBb0g7UUFDcEgsSUFBSSxPQUFPLFlBQVksK0JBQStCO1lBQUUsT0FBTyxxQkFBcUIsQ0FBQztRQUNyRixJQUFJLE9BQU8sWUFBWSx1QkFBdUI7WUFBRSxPQUFPLGFBQWEsQ0FBQztRQUNyRSxJQUFJLE9BQU8sWUFBWSx5QkFBeUI7WUFBRSxPQUFPLGVBQWUsQ0FBQztRQUN6RSxJQUFJLE9BQU8sWUFBWSwrQkFBK0IsRUFBRTtZQUNwRCxPQUFPLHFCQUFxQixDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxPQUFPLFlBQVksOEJBQThCLEVBQUU7WUFDbkQsT0FBTyxvQkFBb0IsQ0FBQztTQUMvQjtRQUNELElBQUksT0FBTyxZQUFZLHdCQUF3QixFQUFFO1lBQzdDLE9BQU8sYUFBYSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxPQUFPLFlBQVkseUJBQXlCO1lBQUUsT0FBTyxjQUFjLENBQUM7UUFDeEUsSUFBSSxPQUFPLFlBQVksbUJBQW1CO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDNUQsSUFBSSxPQUFPLFlBQVkscUJBQXFCO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDaEUsSUFBSSxPQUFPLFlBQVkseUJBQXlCO1lBQUUsT0FBTyxjQUFjLENBQUM7UUFDeEUsSUFBSSxPQUFPLFlBQVksNEJBQTRCLEVBQUU7WUFDakQsT0FBTyxpQkFBaUIsQ0FBQztTQUM1QjtRQUNELElBQUksT0FBTyxZQUFZLHVCQUF1QixFQUFFO1lBQzVDLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3BELE9BQU8sWUFBWSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNILE9BQU8sbUJBQW1CLENBQUM7YUFDOUI7U0FDSjtRQUNELElBQUksT0FBTyxZQUFZLHdCQUF3QjtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQ3RFLElBQUksT0FBTyxZQUFZLHdCQUF3QjtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQ3RFLElBQUksT0FBTyxZQUFZLGtCQUFrQjtZQUFFLE9BQU8sY0FBYyxDQUFDO1FBQ2pFLElBQUksT0FBTyxZQUFZLFdBQVc7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNuRCxJQUFJLE9BQU8sWUFBWSxlQUFlO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDM0QsSUFBSSxPQUFPLFlBQVksbUJBQW1CO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDNUQsSUFBSSxPQUFPLFlBQVkseUJBQXlCO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDbEUsSUFBSSxPQUFPLFlBQVksMkJBQTJCO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDdEUsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE9BQU87UUFDOUIsSUFBSSxPQUFPLFlBQVksV0FBVztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ25ELElBQUksT0FBTyxZQUFZLFdBQVc7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUVuRCxJQUFJLE9BQU8sWUFBWSxpQkFBaUIsRUFBRTtZQUN0QyxPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUVELElBQUksT0FBTyxZQUFZLHFCQUFxQixFQUFFO1lBQzFDLE1BQU0sV0FBVyxHQUEwQixPQUFPLENBQUM7WUFDbkQsSUFBSSxXQUFXLENBQUMsUUFBUTtnQkFBRSxPQUFPLFVBQVUsQ0FBQztZQUM1QyxPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUNELElBQUksT0FBTyxZQUFZLG1CQUFtQjtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFELElBQUksT0FBTyxZQUFZLHVCQUF1QjtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzlELElBQ0ksT0FBTyxZQUFZLG1CQUFtQjtlQUNuQyxPQUFPLFlBQVkscUJBQXFCLEVBQzdDO1lBQ0UsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxJQUNJLE9BQU8sWUFBWSxxQkFBcUI7ZUFDckMsT0FBTyxZQUFZLHlCQUF5QjtlQUM1QyxPQUFPLFlBQVksNEJBQTRCO2VBQy9DLE9BQU8sWUFBWSwrQkFBK0IsRUFDdkQ7WUFDRSxPQUFPLGVBQWUsQ0FBQztTQUMxQjtRQUNELElBQUksT0FBTyxZQUFZLHVCQUF1QixFQUFFO1lBQzVDLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3BELE9BQU8sWUFBWSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNILE9BQU8sbUJBQW1CLENBQUM7YUFDOUI7U0FDSjtRQUNELElBQUksT0FBTyxZQUFZLHdCQUF3QjtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQ3RFLElBQUksT0FBTyxZQUFZLG9CQUFvQjtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzlELElBQ0ksT0FBTyxZQUFZLGlCQUFpQjtlQUNqQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssT0FBTzttQkFDM0IsT0FBTyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsRUFDM0M7WUFDRSxPQUFPLE9BQU8sQ0FBQztTQUNsQjtRQUNELElBQUksT0FBTyxZQUFZLHdCQUF3QjtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQ3RFLElBQUksT0FBTyxZQUFZLGtCQUFrQjtZQUFFLE9BQU8sY0FBYyxDQUFDO1FBQ2pFLElBQUksT0FBTyxZQUFZLFdBQVc7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNuRCxJQUFJLE9BQU8sWUFBWSxxQkFBcUI7WUFBRSxPQUFPLGVBQWUsQ0FBQztRQUNyRSxJQUFJLE9BQU8sWUFBWSxlQUFlLEVBQUU7WUFDcEMsT0FBTyxXQUFXLENBQUM7U0FDdEI7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUssWUFBWTs7WUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDcEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNSLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBRWEsYUFBYSxDQUFDLFdBQTRCOztZQUNwRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO29CQUNwQixJQUFJLFNBQVMsQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFO3dCQUM5QixTQUFTO3FCQUNaO2lCQUNKO3FCQUNJLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7b0JBQUUsU0FBUztnQkFFaEQsSUFBSSxDQUFDLENBQUEsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQSxFQUFFO29CQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztpQkFDNUI7Z0JBRUQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3ZDO1FBQ0wsQ0FBQztLQUFBO0lBRUssbUJBQW1CLENBQUMsU0FBUzs7WUFDL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLENBQUEsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBLEVBQUU7b0JBQ25DLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBRUssb0JBQW9CLENBQUMsT0FBOEIsRUFBRSxLQUFNLEVBQUUsU0FBVSxFQUFFLFdBQVksRUFBRSxVQUFXLEVBQUUsVUFBVyxFQUFFLE1BQU87O1lBQzFILElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtnQkFDbEIsSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFO29CQUNyQixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDNUc7cUJBQU0sSUFBSSxPQUFPLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUU7b0JBQ3hELE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUM1RzthQUVKO2lCQUNJO2dCQUNELE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQzdHO1FBQ0wsQ0FBQztLQUFBO0lBZ0VEOzs7O01BSUU7SUFDVyw4QkFBOEIsQ0FBQyxPQUE2RCxFQUFFLFVBQVc7O1lBQ2xILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNELE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO2dCQUM1QixXQUFXO2dCQUNYLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixRQUFRLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQUM7WUFFSCxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7Z0JBQ3pCLElBQUk7b0JBQ0EsTUFBTSxPQUFPLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUM1QztnQkFDRCxXQUFNLEdBQUc7YUFDWjtRQUNMLENBQUM7S0FBQTtJQUVZLHNCQUFzQixDQUFDLE9BQThCLEVBQUUsVUFBVSxFQUFFLGdCQUFxQjs7WUFDakcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBQzVCLFdBQVc7Z0JBQ1gsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFVBQVU7YUFDcEMsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztZQUV4QyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtnQkFDNUIsSUFBSTtvQkFDQSxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDL0M7Z0JBQ0QsV0FBTSxHQUFHO2FBQ1o7UUFDTCxDQUFDO0tBQUE7SUFFSyx3QkFBd0IsQ0FBQyxPQUFtRyxFQUFFLFVBQVc7O1lBQzNJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBQzVCLFdBQVc7Z0JBQ1gsU0FBUyxFQUFFLE9BQU87Z0JBQ2xCLFFBQVEsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FBQztZQUNILElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDakIsSUFBSTtvQkFDQSxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3BDO2dCQUNELFdBQU0sR0FBRzthQUNaO1FBQ0wsQ0FBQztLQUFBO0lBRVksdUJBQXVCLENBQUMsT0FBd0IsRUFBRSxVQUFXOztZQUN0RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1RCxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMvQixJQUFJLFVBQVUsRUFBRSxFQUFFLGtHQUFrRztvQkFDaEgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFVBQVUsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQzdEO3FCQUNJO29CQUNELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQy9DO2dCQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUN4QjtRQUNMLENBQUM7S0FBQTtJQUVELGFBQWE7UUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7SUFFRCxpQkFBaUI7UUFDYixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDL0IsWUFBWSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsSUFBSSxRQUFRLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztpQkFDckYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUMvRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN4RyxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7b0JBQ2xCLE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1g7YUFBTTtZQUNILElBQUksQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDWDtJQUNMLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxPQUF3QjtRQUM3RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLGFBQWE7UUFDakIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDOUMsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ25ELFNBQVM7YUFDWjtZQUNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNuRCxrQ0FBa0M7WUFDbEMsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksaUJBQWlCLEVBQUU7b0JBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsV0FBVyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTs0QkFDNUQsT0FBTyxLQUFLLENBQUM7eUJBQ2hCO3FCQUNKO2lCQUNKO2FBQ0o7aUJBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFDNUMsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFlTSxpQkFBaUIsQ0FBQyxPQUE0QixFQUFFLEtBQUssRUFBRSxVQUFVO1FBQ3BFLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNqQixJQUFJO2dCQUNBLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUM7b0JBQzFCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7b0JBQ3JELFdBQVcsRUFBRSxLQUFLO29CQUNsQixTQUFTLEVBQUUsT0FBTztvQkFDbEIsUUFBUSxFQUFFLElBQUk7aUJBQ2pCLENBQUMsQ0FBQyxDQUFDO2FBQ1A7WUFDRCxXQUFNLEdBQUc7U0FDWjtJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsV0FBNEI7UUFDN0MsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ3BDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDaEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUM7b0JBQzVCLFdBQVc7b0JBQ1gsU0FBUyxFQUFFLGFBQWE7b0JBQ3hCLFFBQVEsRUFBRSxJQUFJO2lCQUNqQixDQUFDLENBQUM7Z0JBQ0gsSUFBSTtvQkFDQSxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDckM7Z0JBQ0QsV0FBTSxHQUFHO2FBQ1o7U0FDSjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELHVGQUF1RjtJQUN6RSxRQUFRLENBQUMsV0FBNEIsRUFBRSxRQUFpQixLQUFLOztZQUN2RSxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDcEMsSUFBSSxPQUFPLFlBQVkscUJBQXFCO21CQUNyQyxPQUFPLFlBQVksNEJBQTRCO21CQUMvQyxPQUFPLFlBQVksb0JBQW9CO21CQUN2QyxPQUFPLFlBQVksd0JBQXdCLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFO29CQUMxRCxPQUFPLElBQUksQ0FBQztpQkFDZjthQUNKO1lBRUQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN4QyxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQzs0QkFDNUIsV0FBVzs0QkFDWCxTQUFTLEVBQUUsVUFBVTs0QkFDckIsUUFBUSxFQUFFLElBQUk7eUJBQ2pCLENBQUMsQ0FBQzt3QkFDSCxJQUFJOzRCQUNBLElBQUksQ0FBQSxNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQUssS0FBSyxFQUFFO2dDQUMvQyxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ2pDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtvQ0FDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQ0FDcEI7NkJBQ0o7eUJBQ0o7d0JBQ0QsV0FBTSxHQUFHO3FCQUNaO29CQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ25CLE9BQU8sS0FBSyxDQUFDO3FCQUNoQjtpQkFDSjthQUNKO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBRUQsb0RBQW9EO0lBQ3BELHdEQUF3RDtJQUN4RCwwQkFBMEI7SUFDMUIsNkVBQTZFO0lBQzdFLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsZ0VBQWdFO0lBQ2hFLDBCQUEwQjtJQUMxQixJQUFJO0lBRUosc0RBQXNEO0lBQ3RELGdDQUFnQztJQUNoQyw4REFBOEQ7SUFDOUQsV0FBVztJQUNYLHdDQUF3QztJQUN4QyxJQUFJO0lBRUksaUJBQWlCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVO1FBQ2hELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDL0Q7SUFDTCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsWUFBb0I7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDeEc7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVNLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTztRQUMxQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDWCxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDdEIsWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksS0FBSyxZQUFZLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM1QyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbEM7WUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNuQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDekQsSUFBSSxJQUFJLEVBQUU7b0JBQ04sT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdCO2FBQ0o7aUJBQ0ksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdEIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQy9ELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2xCO1NBQ0o7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUMvQixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxRQUFRLEVBQUU7WUFDdEIsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUNELElBQ0ksS0FBSyxZQUFZLEtBQUs7ZUFDbkIsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3JCO1lBQ0UsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU0scUJBQXFCLENBQUMsYUFBYSxJQUFJLENBQUM7SUFFeEMsYUFBYSxDQUFDLE9BQU87UUFDeEIsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDO1FBQzdCLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUNwQixNQUFNLElBQUksWUFBWSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLFlBQVksQ0FBQyxHQUFHO1FBQ3BCLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3hDLElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksRUFBRSxHQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRTtvQkFDN0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7b0JBQ3hCLElBQUksRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLO3dCQUFFLE1BQU07aUJBQ25DO2dCQUVELElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxjQUFjO29CQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUNwRDtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUVLLGlCQUFpQjtRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNuRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNuRSxJQUFJLElBQUksRUFBRTtZQUNOLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztnQkFDMUIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsMkNBQTJDLENBQUMsQ0FBQztnQkFDbEcsSUFBSSxZQUFZLEVBQUU7b0JBQ2QsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNuQztxQkFBTTtvQkFDSCxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzdELElBQ0ksWUFBWSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFDOUQ7d0JBQ0UsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO3FCQUN4Qjt5QkFBTTt3QkFDSCxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzNELElBQUksWUFBWSxFQUFFOzRCQUNkLE1BQU0sQ0FBQyxZQUFZLENBQUM7aUNBQ2YsUUFBUSxFQUFFO2lDQUNWLElBQUksQ0FBQyxNQUFNLENBQUM7Z0NBQ2Isd0NBQXdDO2lDQUN2QyxLQUFLLEVBQUUsQ0FBQzs0QkFDYixZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQ3BDLGVBQWUsQ0FDbEIsQ0FBQzt5QkFDTDtxQkFDSjtpQkFDSjtnQkFFRCxJQUFJLFlBQVksRUFBRTtvQkFDZCxNQUFNO2lCQUNUO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFTyx3QkFBd0I7UUFDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDbkQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELElBQUksWUFBWSxFQUFFO2dCQUNkLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNuQztpQkFBTTtnQkFDSCxZQUFZLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkQsSUFDSSxZQUFZLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUM5RDtvQkFDRSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNILFlBQVksR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNqRCxJQUFJLFlBQVksRUFBRTt3QkFDZCxNQUFNLENBQUMsWUFBWSxDQUFDOzZCQUNmLFFBQVEsRUFBRTs2QkFDVixJQUFJLENBQUMsTUFBTSxDQUFDOzRCQUNiLHdDQUF3Qzs2QkFDdkMsS0FBSyxFQUFFLENBQUM7d0JBQ2IsWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUNwQyxlQUFlLENBQ2xCLENBQUM7cUJBQ0w7aUJBQ0o7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUFLO1FBQ3BCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRTtnQkFDdkMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDL0IsTUFBTTtpQkFDVDtnQkFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQzthQUM5QjtZQUNELElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN6QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLFlBQVksSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7aUJBQzFCO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFTSxTQUFTLENBQUMsSUFBSTtRQUNqQixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNDLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZDLElBQ0ksSUFBSSxDQUFDLFdBQVc7Y0FDZCxJQUFJLENBQUMsWUFBWTtjQUNqQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNO2NBQ25DLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUs7Z0JBQ2hDLENBQUMsRUFDUDtZQUNFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxVQUFVLEdBQUc7WUFDZixDQUFDLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQztZQUMzRCxDQUFDLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQztTQUM5RCxDQUFDO1FBRUYsSUFBSSxjQUFjLEdBQVEsQ0FDdEIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUN4RCxDQUFDO1FBQ0YsSUFBSSxjQUFjLEVBQUU7WUFDaEIsR0FBRztnQkFDQyxJQUFJLGNBQWMsS0FBSyxJQUFJO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN6QyxzREFBc0Q7YUFDekQsUUFBUSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUU7U0FDMUQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFvQixFQUFFLFNBQVM7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQU0sRUFBRSxFQUFDLEVBQUU7WUFDdEQsSUFBSSxDQUFDLEVBQUU7Z0JBQUUsT0FBTztZQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXBELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksU0FBUyxDQUFDO29CQUN4QyxXQUFXLEVBQUUsU0FBUztvQkFDdEIsVUFBVSxFQUFFLGVBQWU7b0JBQzNCLFNBQVMsRUFBRSxVQUFVO29CQUNyQixRQUFRLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDLENBQUM7YUFDUDtZQUNELElBQUksUUFBUSxLQUFLLEtBQUssRUFBRTtnQkFDcEIsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFFN0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBRXhCLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtvQkFDbkIsSUFBSTt3QkFDQSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUM7NEJBQ2xDLFdBQVcsRUFBRSxTQUFTOzRCQUN0QixVQUFVLEVBQUUsZUFBZTs0QkFDM0IsU0FBUyxFQUFFLGNBQWM7NEJBQ3pCLFFBQVEsRUFBRSxJQUFJO3lCQUNqQixDQUFDLENBQUMsQ0FBQztxQkFDUDtvQkFDRCxXQUFNLEdBQUc7aUJBQ1o7Z0JBRUQsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO29CQUNuQixJQUFJO3dCQUNBLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQzs0QkFDbEMsV0FBVyxFQUFFLFNBQVM7NEJBQ3RCLFVBQVUsRUFBRSxlQUFlOzRCQUMzQixTQUFTLEVBQUUsU0FBUzs0QkFDcEIsUUFBUSxFQUFFLElBQUk7eUJBQ2pCLENBQUMsQ0FBQyxDQUFDO3FCQUNQO29CQUNELFdBQU0sR0FBRztpQkFDWjthQUNKO1FBQ0wsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFWSxTQUFTLENBQUMsT0FBb0IsRUFBRSxTQUFTLEVBQUUsU0FBVTs7WUFDOUQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLFlBQVksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRztvQkFDeEIsT0FBTztvQkFDUCxTQUFTO29CQUNULFNBQVM7aUJBQ1osQ0FBQztnQkFDRixPQUFPO2FBQ1Y7WUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxNQUFNLFVBQVUsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7WUFDakQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDOUQ7WUFFRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJO29CQUNBLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDO3dCQUNuQyxXQUFXLEVBQUUsU0FBUzt3QkFDdEIsSUFBSTt3QkFDSixTQUFTLEVBQUUsU0FBUyxJQUFJLFFBQVE7d0JBQ2hDLFFBQVEsRUFBRSxJQUFJO3FCQUNqQixDQUFDLENBQUMsQ0FBQztpQkFDUDtnQkFDRCxXQUFNO29CQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7aUJBQ2pCO2FBQ0o7WUFFRCxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUU7Z0JBQ2pCLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQixTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFFN0IsSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFO29CQUNyQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDM0I7Z0JBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzVELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtvQkFDbkIsSUFBSTt3QkFDQSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUM7NEJBQ2xDLFdBQVcsRUFBRSxTQUFTOzRCQUN0QixVQUFVLEVBQUUsVUFBVTs0QkFDdEIsU0FBUyxFQUFFLFNBQVMsSUFBSSxjQUFjOzRCQUN0QyxRQUFRLEVBQUUsSUFBSTt5QkFDakIsQ0FBQyxDQUFDLENBQUM7cUJBQ1A7b0JBQ0QsV0FBTSxHQUFHO2lCQUNaO2dCQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtvQkFDakIsSUFBSTt3QkFDQSxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUM7NEJBQ2hDLFdBQVcsRUFBRSxTQUFTOzRCQUN0QixVQUFVLEVBQUUsVUFBVTs0QkFDdEIsU0FBUyxFQUFFLFNBQVMsSUFBSSxPQUFPOzRCQUMvQixRQUFRLEVBQUUsSUFBSTt5QkFDakIsQ0FBQyxDQUFDLENBQUM7cUJBQ1A7b0JBQ0QsV0FBTSxHQUFHO2lCQUNaO2FBQ0o7UUFDTCxDQUFDO0tBQUE7SUFFTSxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBVTtRQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNqRDtJQUNMLENBQUM7SUFFSyxtQkFBbUIsQ0FBQyxJQUFJOztZQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7WUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQztZQUN0RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDL0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUNBQVEsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBSyxJQUFJLENBQUUsQ0FBQztnQkFDdEcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFDM0I7aUJBQ0k7Z0JBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQzFDLE1BQU0sVUFBVSxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDakQsS0FBSyxNQUFNLFVBQVUsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO29CQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDdkQ7Z0JBRUQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7b0JBQ2xCLElBQUk7d0JBQ0EsS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTLENBQUM7NEJBQ25DLFdBQVcsRUFBRSxTQUFTOzRCQUN0QixJQUFJOzRCQUNKLFNBQVMsRUFBRSxTQUFTLElBQUksUUFBUTs0QkFDaEMsUUFBUSxFQUFFLElBQUk7eUJBQ2pCLENBQUMsQ0FBQyxDQUFDO3FCQUNQO29CQUNELFdBQU07d0JBQ0YsS0FBSyxHQUFHLEtBQUssQ0FBQztxQkFDakI7aUJBQ0o7Z0JBRUQsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO29CQUNqQixTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0IsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBRTdCLElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRTt3QkFDckIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7cUJBQzNCO29CQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM1RCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7d0JBQ25CLElBQUk7NEJBQ0EsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDO2dDQUNsQyxXQUFXLEVBQUUsU0FBUztnQ0FDdEIsVUFBVSxFQUFFLFVBQVU7Z0NBQ3RCLFNBQVMsRUFBRSxTQUFTLElBQUksY0FBYztnQ0FDdEMsUUFBUSxFQUFFLElBQUk7NkJBQ2pCLENBQUMsQ0FBQyxDQUFDO3lCQUNQO3dCQUNELFdBQU0sR0FBRztxQkFDWjtvQkFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7d0JBQ2pCLElBQUk7NEJBQ0EsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDO2dDQUNoQyxXQUFXLEVBQUUsU0FBUztnQ0FDdEIsVUFBVSxFQUFFLFVBQVU7Z0NBQ3RCLFNBQVMsRUFBRSxTQUFTLElBQUksT0FBTztnQ0FDL0IsUUFBUSxFQUFFLElBQUk7NkJBQ2pCLENBQUMsQ0FBQyxDQUFDO3lCQUNQO3dCQUNELFdBQU0sR0FBRztxQkFDWjtpQkFDSjthQUNKO1FBQ0wsQ0FBQztLQUFBO0lBRU0sT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFvQixFQUFFLFNBQVM7UUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDaEIsSUFBSTtnQkFDQSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDO29CQUN6QixXQUFXLEVBQUUsU0FBUztvQkFDdEIsVUFBVSxFQUFFLGFBQWE7b0JBQ3pCLFNBQVMsRUFBRSxNQUFNO29CQUNqQixRQUFRLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDLENBQUM7YUFDUDtZQUNELFdBQU0sR0FBRztTQUNaO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBb0IsRUFBRSxTQUFTO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzNDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHO1lBQ3hCLE9BQU87WUFDUCxTQUFTO1lBQ1QsS0FBSztTQUNSLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRVksZ0JBQWdCLENBQUMsT0FBb0IsRUFBRSxHQUFHLEVBQUUsU0FBVSxFQUFFLFdBQVksRUFBRSxVQUFXLEVBQUUsVUFBVyxFQUFFLE1BQU87O1lBQ2hILElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFELElBQUksV0FBVyxDQUFDO1lBRWhCLGVBQWU7WUFDZixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7Z0JBQ2pCLFdBQVcsR0FBRyxVQUFVLENBQUM7Z0JBQ3pCLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO2dCQUM5QixVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztnQkFDbkMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7YUFDbEM7aUJBQ0k7Z0JBQ0QsV0FBVyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUU5QixxQkFBcUI7WUFDckIsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsV0FBVyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBQzVCLFdBQVc7Z0JBQ1gsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLFVBQVUsRUFBRSxVQUFVLElBQUksV0FBVztnQkFDckMsU0FBUztnQkFDVCxRQUFRLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQUM7WUFDSCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUV4QztZQUNELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFDM0I7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDO0tBQUE7SUFFSyxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFvQjs7WUFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUM7WUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUN6RCxPQUFPO2FBQ1Y7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztLQUFBO0lBRU8sZ0JBQWdCLENBQUMsR0FBRztRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQW9CLEVBQUUsU0FBUztRQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNuQixJQUFJO2dCQUNBLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUM7b0JBQzVCLFdBQVcsRUFBRSxTQUFTO29CQUN0QixVQUFVLEVBQUUsYUFBYTtvQkFDekIsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFFBQVEsRUFBRSxJQUFJO2lCQUNqQixDQUFDLENBQUMsQ0FBQzthQUNQO1lBQ0QsV0FBTSxHQUFHO1NBQ1o7SUFDTCxDQUFDO0lBRU0sMkJBQTJCLENBQUMsT0FBb0I7UUFDbkQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1osSUFBSSxPQUFPLENBQUMsVUFBVTtZQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakMsSUFBSSxPQUFPLENBQUMsUUFBUTtZQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLENBQUMsUUFBUTtZQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLENBQUMsVUFBVTtZQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxhQUFhLENBQUMsUUFBUTtRQUN6QixJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUU7WUFDdkIsT0FBTyxpQkFBaUIsQ0FBQztTQUM1QjtJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBUyxFQUFFLE9BQXdCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBd0IsRUFBRSxXQUFnQixFQUFFLElBQVk7UUFDaEUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxQixXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJO2VBQzFELENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVM7bUJBQ3BELENBQUMsT0FBTyxDQUFDLE1BQU07dUJBQ1gsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUNwRixDQUNKLENBQUM7UUFDTixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVM7UUFDeEMsT0FBTztZQUNILE9BQU87WUFDUCxJQUFJO1lBQ0osS0FBSztZQUNMLFNBQVM7WUFDVCxVQUFVLEVBQUUsR0FBRyxTQUFTLElBQUksS0FBSyxHQUFHO1lBQ3BDLElBQUksRUFBRSxHQUFHLFNBQVMsSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRTtZQUMvQyxTQUFTLEVBQUUsS0FBSztZQUNoQixPQUFPLEVBQUUsRUFBRTtTQUNkLENBQUM7SUFDTixDQUFDO0lBRU0sZ0JBQWdCO1FBQ25CLE9BQU8sQ0FDSCxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO2VBQ25DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsQ0FDNUMsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVNLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRTNCLFVBQVUsQ0FBQyxLQUFLO0lBRXZCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxHQUFHO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEdBQUc7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU0saUJBQWlCLENBQUMsR0FBRztRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxHQUFHO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFHO0lBRWxCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxPQUE4QixFQUFFLElBQVM7UUFDMUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRixJQUFJLE9BQU8sQ0FBQyxVQUFVLFlBQVksS0FBSztZQUFFLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNuRSxJQUFJLE9BQU8sQ0FBQyxVQUFVLFlBQVksUUFBUTtZQUFFLE9BQU8sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzVFLENBQUM7OztZQTk4REosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxXQUFXO2dCQUNyQix5dStDQUF5QztnQkFFekMsU0FBUyxFQUFFLENBQUMsdUJBQXVCLENBQUM7O2FBQ3ZDOzs7WUE3RHdFLFFBQVE7WUE0QnhFLGFBQWE7WUFDYixXQUFXO1lBekJYLGdCQUFnQjtZQUdoQixxQkFBcUI7WUEyQnJCLGVBQWU7WUEvQmYsWUFBWTtZQTJCWixtQkFBbUI7WUFFbkIsbUJBQW1COzs7MEJBK0J2QixTQUFTLFNBQUMsYUFBYTswQkFDdkIsU0FBUyxTQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7dUJBQzFDLGVBQWUsU0FBQyxXQUFXO3NCQUUzQixLQUFLO3NCQUNMLEtBQUs7NEJBRUwsS0FBSzt5QkFDTCxLQUFLO3FDQUNMLEtBQUs7NkJBQ0wsS0FBSzt5QkFFTCxLQUFLO3FCQU1MLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7bUJBQ0wsS0FBSzswQkE2Q0wsTUFBTTs2QkFDTixNQUFNO2dDQUNOLE1BQU07NkJBQ04sTUFBTTt5QkFDTixNQUFNO3VCQUNOLE1BQU07NkJBQ04sTUFBTTs7QUFpNERYLE1BQU0sT0FBTyxlQUFlO0lBY3hCLFlBQVksS0FBVSxFQUFFLE9BQVcsRUFBRSxLQUFNLEVBQUUsVUFBNEI7UUFSekUsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFLM0IsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFFbEIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUVyQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztRQUM1QixJQUFJLFVBQVUsRUFBRTtZQUNaLElBQUksVUFBVSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7Z0JBQzlCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO29CQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztvQkFDcEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7aUJBQ3pEO3FCQUNJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO29CQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7b0JBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7aUJBQzFCO2FBQ0o7aUJBQ0k7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2FBQzNCO1lBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3ZDO2FBQ0k7WUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDOUI7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ2hEO1NBQ0o7UUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLE1BQU0sRUFBRTtZQUNSLElBQUksTUFBTSxZQUFZLGVBQWUsRUFBRTtnQkFDbkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyRTtpQkFDSSxJQUFJLE1BQU0sWUFBWSxXQUFXLEVBQUU7Z0JBQ3BDLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEU7U0FDSjthQUNJO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xCLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ25DO1NBQ0o7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLGdCQUFnQjtRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBVSxFQUFFLE9BQVcsRUFBRSxRQUFrQjtRQUM5RCxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUU7Z0JBQ3RCLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLFlBQVksRUFBRTtvQkFDakYsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3RFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUM7aUJBQ2xEO2FBQ0o7U0FDSjthQUNJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2xCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO29CQUN0QixNQUFNLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDOUQsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUM7b0JBQy9DLENBQUMsRUFBRSxDQUFDO2lCQUNQO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFTSxZQUFZLENBQUMsS0FBSztRQUNyQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUEyQjtRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksZUFBZTtRQUNmLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYixJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOztZQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEdBQUc7UUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7WUFDdkQsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7WUFDeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHO1FBQ1QsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7O1lBQ3ZELElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ3pCLENBQUM7SUFFTSxTQUFTLENBQUMsS0FBd0IsRUFBRSxTQUFrQixJQUFJO1FBQzdELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFDSTtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFhLEVBQUUsTUFBZTtRQUNqRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNuRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ2hFO2FBQ0k7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQzVDO0lBQ0wsQ0FBQztJQUVNLGFBQWEsQ0FBQyxTQUFTO1FBQzFCLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sbUJBQW1CLENBQUMsVUFBVTtRQUNqQyxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxLQUFLLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sVUFBVSxDQUFDLElBQXFCLEVBQUUsU0FBUztRQUMvQyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO2FBQzlGO1lBQ0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFO29CQUN4RixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDakQsSUFBSSxFQUFFO3dCQUFFLE9BQU8sRUFBRSxDQUFDO2lCQUNyQjthQUNKO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBcUIsRUFBRSxVQUFVO1FBQ3RELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7YUFDakc7WUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JDLElBQUksU0FBUyxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUU7b0JBQzNGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3hELElBQUksRUFBRTt3QkFBRSxPQUFPLEVBQUUsQ0FBQztpQkFDckI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLHdCQUF3QixDQUFDLElBQVksRUFBRSxVQUFpQjtRQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ2xCLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQzVDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEY7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBYyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hFLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCAqIGFzIG5hbm9pZF8gZnJvbSAnbmFub2lkJztcclxuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2NvbnRleHRtZW51JztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XHJcbmltcG9ydCB7IEtleUZsYXNoU2hvdyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtcclxuICAgIEFkZHJlc3NDb250cm9sU2NoZW1hLCBBdXRvQ29tcGxldGVDb250cm9sU2NoZW1hLCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgQnV0dG9uQ29udHJvbFNjaGVtYSwgQ2hlY2tib3hDb250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSwgQ29DYXVUb0NodWNDb250cm9sU2NoZW1hLFxyXG4gICAgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hLCBDb2xvckNvbnRyb2xTY2hlbWEsIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSwgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hLCBDb250YWluZXJTY2hlbWEsIENydWRGb3JtU2V0dGluZyxcclxuICAgIERhdGVUaW1lQ29udHJvbFNjaGVtYSwgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsIERyb3Bkb3duQ29udHJvbFNjaGVtYSwgRWRpdG9yQ29udHJvbFNjaGVtYSwgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEV2ZW50RGF0YSwgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hLCBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSxcclxuICAgIEZpbGVVcGxvYWRNb2RlLFxyXG4gICAgRm9ybUNvbnRyb2xCYXNlLCBGb3JtU2NoZW1hQmFzZSxcclxuICAgIEtleVZhbHVlQ29udHJvbFNjaGVtYSwgTGFiZWxTY2hlbWEsIE1hc2tDb250cm9sU2NoZW1hLCBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEsIE9wZXJhdG9yLCBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgUG9wdXBTaXplLFxyXG4gICAgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSwgU3BhbkNvbnRyb2xTY2hlbWEsIFN3aXRjaENvbnRyb2xTY2hlbWEsIFRhYmxlU2NoZW1hLCBUZW1wbGF0ZUNvbnRyb2xTY2hlbWEsIFRleHRBcmVhQ29udHJvbFNjaGVtYSwgVGV4dENvbnRyb2xTY2hlbWEsXHJcbiAgICBUaXRsZVNjaGVtYSwgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEsIFZhbkJhblBpY2tlckNvbnRyb2xTY2hlbWEsIFdyYXBQaWNrZXJDb250cm9sU2NoZW1hXHJcbn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb21tb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5UGlja2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2VudGl0eS1waWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hc3RlckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFzdGVyLWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24vc2VydmljZXMvZHJvcGRvd24uc2VydmljZSc7XHJcbmltcG9ydCB7IGJhc2VUcmluaEt5IH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcclxuaW1wb3J0IHsgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IsIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yLCBDb21wYXJlVmFsaWRhdG9yLCBEYXRlQ29tcGFyZVZhbGlkYXRvciwgRW1haWxWYWxpZGF0b3IsIE51bWJlckNvbXBhcmVWYWxpZGF0b3IsIE51bWJlck9ubHlWYWxpZGF0b3IsIFBob25lTnVtYmVyVmFsaWRhdG9yLCBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvciwgUmVxdWlyZWRWYWxpZGF0b3IsIFNhbWVWYWx1ZVZhbGlkYXRvciB9IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL3ZhbGlkYXRvcnMnO1xyXG5pbXBvcnQgeyBpc0FycmF5LCBpc0xpdGVyYWxPYmplY3QsIG1lcmdlSlNPTiwgbWVyZ2VKU09OT2xkIH0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Vudmlyb25tZW50LXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5cclxuLy8gZml4IGZvciBidWlsZCBwcm9kXHJcbmNvbnN0IG5hbm9pZCA9IG5hbm9pZF87XHJcbmNvbnN0IGpRdWVyeSA9IGpRdWVyeV87XHJcblxyXG5kZWNsYXJlIHZhciB0aW55bWNlOiBhbnk7XHJcblxyXG5jb25zdCBvcGVyYXRvckNvbnRyYXN0ID0ge1xyXG4gICAgW09wZXJhdG9yLmdyZWF0ZXJdOiBPcGVyYXRvci5sb3dlcixcclxuICAgIFtPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXTogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXHJcbiAgICBbT3BlcmF0b3IubG93ZXJdOiBPcGVyYXRvci5ncmVhdGVyLFxyXG4gICAgW09wZXJhdG9yLmxvd2VyVGhhbkVxdWFsXTogT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbFxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NydWQtZm9ybScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NydWQtZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcnVkRm9ybUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICBAVmlld0NoaWxkKCdmb3JtRWxlbWVudCcpIGZvcm1FbGVtZW50OiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnUnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZVJlZikgY2hpbGRyZW46IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgICBASW5wdXQoKSBzZXR0aW5nOiBDcnVkRm9ybVNldHRpbmcgPSBuZXcgQ3J1ZEZvcm1TZXR0aW5nKCk7XHJcbiAgICBASW5wdXQoKSBjb250ZXh0OiBDb21wb25lbnRDb250ZXh0U2VydmljZTtcclxuXHJcbiAgICBASW5wdXQoKSBmaWxlc1VwbG9hZGVkID0gW107XHJcbiAgICBASW5wdXQoKSBpc1ZpZXdNb2RlID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlS2V5cHJlc3NDb250cm9sID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlQ2FjaGluZyA9IGZhbHNlO1xyXG4gICAgX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCc7XHJcbiAgICBASW5wdXQoKSBzZXQgc3R5bGVDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fc3R5bGVDbGFzcyA9ICdwLWZsdWlkJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEBJbnB1dCgpIGZvcm1JZCA9ICcnO1xyXG4gICAgQElucHV0KCkgZm9ybUNsYXNzID0gJyc7XHJcbiAgICBASW5wdXQoKSBhdXRvRm9jdXMgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgdHJhcEZvY3VzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHNldCBkYXRhKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmNhblByaW50ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX21pbmltaXplZERhdGEgIT0gdmFsdWUgJiYgaXNMaXRlcmFsT2JqZWN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RlbERhdGEgPSBtZXJnZUpTT04odGhpcy5fbW9kZWxEYXRhLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYW4oKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnbW9kZWxDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEodGhpcy5fbW9kZWxEYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWREYXRhRWRpdE9sZCAmJiB0aGlzLmxvYWRlZERhdGFFZGl0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhblByaW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDYW5QcmludCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ21vZGVsQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlZC5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25Gb3JtUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWxsQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZnRlclRyaW5oS3kgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBfcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIF9taW5pbWl6ZWREYXRhOiBhbnk7XHJcbiAgICBfbW9kZWxEYXRhOiBhbnkgPSB7fTtcclxuICAgIF91bnN1YnNjcmliZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIF9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIERvYyB0dSBjYXUgaGluaCB0aGFtIHNvIGhlIHRob25nXHJcbiAgICBsaW1pdFNpemUgPSAwO1xyXG4gICAgZm9ybUNvbnRyb2xzOiBhbnkgPSBbXTtcclxuICAgIGZ1bmNDaGVja1VuaXF1ZUZpZWxkOiBhbnkgPSB7fTtcclxuICAgIGJlZm9yZURhdGE6IGFueSA9IHt9O1xyXG4gICAgZmlyc3REaXZIb2xkZXI6IGFueTtcclxuICAgIGNhY2hlZFZhbHVlcyA9IHt9O1xyXG4gICAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfSA9IHt9O1xyXG4gICAgX3ByZWZpeEN1c3RvbUhlYWRlciA9ICdjdXN0b21IZWFkZXJfJztcclxuXHJcbiAgICBsb2FkZWREYXRhRWRpdE9sZCA9IGZhbHNlO1xyXG4gICAgbG9hZGVkRGF0YUVkaXQgPSBmYWxzZTtcclxuICAgIGNhblByaW50ID0gZmFsc2U7XHJcblxyXG4gICAgdGFibGVGb3JtU2hvdyA9IGZhbHNlO1xyXG4gICAgdGFibGVGb3JtVGl0bGU6IHN0cmluZztcclxuICAgIHRhYmxlRm9ybVBvcHVwU2l6ZSA9IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSk7XHJcbiAgICB0YWJsZUZvcm1EYXRhOiBhbnkgPSB7fTtcclxuICAgIHRhYmxlRm9ybUN1cnJlbnRSb3c6IG51bWJlcjtcclxuICAgIHRhYmxlRm9ybVNjaGVtYTogRm9ybVNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgdGFibGVGb3JtQ3VycmVudEluZm86IGFueSA9IHt9O1xyXG5cclxuICAgIGJ1dHRvbkNvbnRleHRzOiBNZW51SXRlbVtdID0gW107XHJcbiAgICByb3dEYXRhQ3VycmVudDogYW55ID0ge307XHJcbiAgICBjb250cm9sTmVlZENoZWNrUmVhZHk6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgIHJlYWR5U3RhdHVzOiBhbnkgPSB7fTtcclxuICAgIGZpZWxkUGFyZW50RmllbGQgPSAncGFyZW50RmllbGQnO1xyXG4gICAgd2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0OiBhbnk7XHJcblxyXG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcclxuICAgIHB1YmxpYyBfbWFzdGVyRGF0YVNlcnZpY2U6IE1hc3RlckRhdGFTZXJ2aWNlO1xyXG4gICAgcHVibGljIF91c2VyU2VydmljZTogVXNlclNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9kcm9wZG93blNlcnZpY2U6IERyb3Bkb3duU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgIHB1YmxpYyBfZW50aXR5UGlja2VyU2VydmljZTogRW50aXR5UGlja2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZ1NlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTWFzdGVyRGF0YVNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgLy8gR2V0IENvbmZpZ3VyYXRpb25TeXN0ZW1cclxuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZS5nZXRDb25maWdCeUNvZGUoJ1NpemVPZkZpbGUnKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbWl0U2l6ZSA9IE51bWJlcihyZXNwb25zZSkgKiAxMDAwICogMTAwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmhpZGRlblRyaW5oS3kpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgbmV3IEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3ByaW50RmlsZUlkJyxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IEZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuQ2hlY2s6IChtb2RlbCwgY3VycmVudE5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtb2RlbC5wcmludEZpbGVJZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0TG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFZpZXdNb2RlKHJlYWRvbmx5VmlldyA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLmlzVmlld01vZGUgPSByZWFkb25seVZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhbigpIHtcclxuICAgICAgICB0aGlzLmNsZWFuTW9kZWwodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsZWFuTW9kZWwobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX3N0YXR1cycpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgaW4gbW9kZWxba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFtrZXldW3NdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ19lcnJvcnMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxba2V5XVtzXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1pbmltaXplRGF0YShtb2RlbCkge1xyXG4gICAgICAgIGlmIChpc0xpdGVyYWxPYmplY3QobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5fZHJvcGRvd252YWx1ZSAhPSBudWxsICYmIG1vZGVsLl9kcm9wZG93bnZhbHVlICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW21vZGVsLl9kcm9wZG93bnZhbHVlXSB8fCBtb2RlbFsndmFsdWUnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE1pbmltaXplRGF0YShtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZ2V0TWluaW1pemVEYXRhKGl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNjaGVtYSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSB0aGlzLmFwcGx5Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdmb3JtUmVhZHknLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3Rvcihjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGjhu7FjIGhp4buHbiBzYXUgY8O5bmcga2hpIHThuqV0IGPhuqMgbW9kZWwgxJHDoyBpbml0IHhvbmdcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTXVsdGlSb3coY29udHJvbCwgYWRkTW9yZSwgX3BhcmVudFBhdGgsICdpbml0Jyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIC8vIGlmICghcGFyZW50TW9kZWwuaGFzT3duUHJvcGVydHkoY29udHJvbC5maWVsZCkgJiYgY29udHJvbC5maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIC8vICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIC8vICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbCwgY29udHJvbCwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgY29udHJvbC5maWVsZCk7XHJcblxyXG4gICAgICAgIGxldCBfcGFyZW50UGF0aCA9IGNvbnRyb2wuZmllbGQ7XHJcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZE1vcmUgPSBjb250cm9sLmluaXRSb3dDb3VudCAtIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGFkZE1vcmUgPiAwICYmICFwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKGl0ZW0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5oYXNPd25Qcm9wZXJ0eShjb250cm9sLmZpZWxkKSAmJiBjb250cm9sLmZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50Ll9oYXNMb2FkZWREYXRhc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWwubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWxbMF0udmFsdWVbY29udHJvbC52YWx1ZUZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGZpZWxkKSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc291cmNlKSBwYXJlbnRNb2RlbC5fc291cmNlID0ge307XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1cykgcGFyZW50TW9kZWwuX3N0YXR1cyA9IHt9O1xyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX2Vycm9ycykgcGFyZW50TW9kZWwuX2Vycm9ycyA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdKSBwYXJlbnRNb2RlbC5fc3RhdHVzW2ZpZWxkXSA9IHt9O1xyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX2Vycm9yc1tmaWVsZF0pIHBhcmVudE1vZGVsLl9lcnJvcnNbZmllbGRdID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbFNjaGVtYShzY2hlbWE6IEZvcm1TY2hlbWFCYXNlLCBwYXJlbnRJZD8pIHtcclxuICAgICAgICBpZiAoc2NoZW1hLmRpc2FibGVkICE9IHRydWUpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3TW9kZSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2NoZW1hLmxhYmVsICYmICFzY2hlbWEuZnVsbExhYmVsKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5mdWxsTGFiZWwgPSBzY2hlbWEubGFiZWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGl0bGVTY2hlbWFcclxuICAgICAgICAgICAgfHwgc2NoZW1hIGluc3RhbmNlb2YgTGFiZWxTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKCFzY2hlbWEuZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS5maWVsZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NoZW1hLmZpZWxkKSB7XHJcbiAgICAgICAgICAgIGxldCBrZXkgPSBzY2hlbWEuZmllbGQ7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRJZCAhPSBudWxsKSBrZXkgPSBwYXJlbnRJZCArICcuJyArIGtleTtcclxuICAgICAgICAgICAgc2NoZW1hLnVuaXF1ZUZpZWxkID0ga2V5O1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sc1trZXldID0gc2NoZW1hO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2NoZW1hWydjb250cm9sVHlwZSddID0gdGhpcy5nZXRDb250cm9sVHlwZShzY2hlbWEpO1xyXG4gICAgICAgIHNjaGVtYVsnZGF0YVR5cGUnXSA9IHRoaXMuZ2V0Vmlld01vZGVEYXRhVHlwZShzY2hlbWEpO1xyXG5cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJDb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF0gPSBjb250cm9sLnVuaXF1ZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShzdWJDb250cm9sLCBzY2hlbWEudW5pcXVlRmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmZpcmVDYWxsQmFja0luc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIWRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmxvYWRPbkluaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJQaWNrZXJDb250cm9sU2NoZW1hID0gPERyb3Bkb3duQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIHVzZXJQaWNrZXJDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgY29udHJvbC51bmlxdWVGaWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hID0gPEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmZpcmVDYWxsQmFja0luc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzY2hlbWE6IGFueSkge1xyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IHRtcEZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSkge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykgPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gYXdhaXQgZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0bXBGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlRmllbGQgPSBmaWx0ZXIuc291cmNlRmllbGQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gc291cmNlRmllbGQpO1xyXG4gICAgICAgICAgICBpZiAoIWZpbHRlci5zdWJGaWVsZFxyXG4gICAgICAgICAgICAgICAgJiYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSB8fCBzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnN1YkZpZWxkID0gc2NoZW1hLnZhbHVlRmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBtYXJrZWRDb250cm9sID0ge307XHJcbiAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGRyb3Bkb3duQ29udHJvbFNjaGVtYSwgdG1wRmlsdGVycywgbWFya2VkQ29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGNoaWxkRHJvcGRvd246IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsIHRtcEZpbHRlcnM6IEZpbHRlcltdLCBtYXJrZWRDb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHRtcEZpbHRlcnMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0bXBGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5mb3JtQ29udHJvbHNbc291cmNlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudERyb3Bkb3duICYmICFtYXJrZWRDb250cm9sW3NvdXJjZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVPbkNoYW5nZUV2ZW50KHBhcmVudERyb3Bkb3duLCAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lZWRHZXREYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5hbGxvd0xvYWREYXRhV2hlblBhcmVudE51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC5ldmVudFR5cGUgPT0gJ2FkanVzdFZhbHVlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnZhbHVlID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC52YWx1ZSA9PSAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChldmVudC52YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV2ZW50LnZhbHVlLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLl9jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LnJlc2V0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkR2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9jcnVkU2VydmljZS5nZXRGaWx0ZXJGcm9tVGVtcGxhdGUodG1wRmlsdGVycywgZXZlbnQucGFyZW50TW9kZWwsIGV2ZW50LnJvb3RNb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIShwYXJlbnREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmVudERyb3Bkb3duLl9jb21wb25lbnQgJiYgcGFyZW50RHJvcGRvd24uX2NvbXBvbmVudC5faGFzTG9hZGVkRGF0YXNvdXJjZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKGZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLl9jb21wb25lbnQgJiYgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93biwgZmlsdGVyLmZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTW9yZU9uQ2hhbmdlRXZlbnQoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBuZXdPbkNoYW5nZSkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkVHJpZ2dlckxvYWRDaGlsZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9sZFRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdG1wRmllbGRPbGRPbkNoYW5nZSA9ICdvbGRPbkNoYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbC5vbkNoYW5nZWQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gb2xkT25DaGFuZ2U7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRFdmVudCA9IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuY29ycmVjdG9ycykgc2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2hlbWEudmFsaWRhdG9ycykgc2NoZW1hLnZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5yZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBSZXF1aXJlZFZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRTY2hlbWEgPSAoPFRleHRDb250cm9sU2NoZW1hPnNjaGVtYSk7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ251bWJlcicgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdhbW91bnQnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgTnVtYmVyT25seVZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5JyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5aW50Jykge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2VtYWlsJykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGV4dFNjaGVtYS5jb3JyZWN0b3JzKSB0ZXh0U2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBHbWFpbENvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBMb3dlckNvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ3Bob25lJyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2ZheCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCB0ZXh0U2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3RvcihzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVTY2hlbWEgPSAoPERhdGVUaW1lQ29udHJvbFNjaGVtYT5zY2hlbWEpO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIGRhdGVUaW1lU2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvci5zZXRCYXNlU2VydmljZSh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWEsIHZhbGlkYXRvci5nZXREdXBsaWNhdGVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFJlcXVpcmVkRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFNhbWVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KFxyXG4gICAgICAgIHZhbGlkYXRvcjogRGF0ZUNvbXBhcmVWYWxpZGF0b3IgfCBOdW1iZXJDb21wYXJlVmFsaWRhdG9yLFxyXG4gICAgICAgIHNjaGVtYTogRGF0ZVRpbWVDb250cm9sU2NoZW1hIHwgVGV4dENvbnRyb2xTY2hlbWEgfCBNYXNrQ29udHJvbFNjaGVtYVxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgY29tcGFyZVVuaXF1ZUZpZWxkID0gdmFsaWRhdG9yLmNvbXBhcmVVbmlxdWVGaWVsZDtcclxuICAgICAgICBpZiAoc2NoZW1hLnVuaXF1ZUZpZWxkID09IGNvbXBhcmVVbmlxdWVGaWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBvcGVyYXRvckNvbXBhcmUgPSB2YWxpZGF0b3IuZ2V0T3BlcmF0b3JDb21wYXJlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBhcmUgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tjb21wYXJlVW5pcXVlRmllbGRdKTtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYUNvbXBhcmUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFDb21wYXJlLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBDb21wYXJlVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgcC5jb21wYXJlVW5pcXVlRmllbGQgPT0gc2NoZW1hLnVuaXF1ZUZpZWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBEYXRlQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFDb21wYXJlLnZhbGlkYXRvcnMucHVzaChuZXcgRGF0ZUNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldER1cGxpY2F0ZUZpZWxkcygpKSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICBfdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFJlcXVpcmVkRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNhbWVWYWx1ZVZhbGlkYXRvcnMoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFNhbWVGaWVsZHMoKSkpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdmFsaWRhdG9yID0gbmV3IFNhbWVWYWx1ZVZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RGF0YURlZmF1bHQoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xyXG4gICAgICAgIGNvbnN0IGdldFNldHRpbmdEYXRhRGVmYXVsdCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5zZXR0aW5nRGF0YURlZmF1bHQ7XHJcbiAgICAgICAgaWYgKHN0cmluZ0RhdGFEZWZhdWx0ICYmICh0aGlzLl9tb2RlbERhdGEgJiYgIXRoaXMuX21vZGVsRGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPERyb3Bkb3duQ29udHJvbFNjaGVtYT5pdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSAoY29udHJvbC5maWVsZCArIChjb250cm9sLnZhbHVlRmllbGQgPT0gJ2lkJyA/ICcnIDogY29udHJvbC52YWx1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YUNhY2hlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRTZXR0aW5nRGF0YURlZmF1bHQpIHsgLy8gbOG6pXkgY+G6pXUgaMOsbmggZmllbGQgbWFwUGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1hcEdldENhY2hlID0gZ2V0U2V0dGluZ0RhdGFEZWZhdWx0W2NvbnRyb2wuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRNYXBHZXRDYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGZpZWxkTWFwR2V0Q2FjaGUgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVsoPEZvcm1TY2hlbWFCYXNlPml0ZW0pLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5Q2FjaGVkVmFsdWVzKCkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKTtcclxuICAgICAgICB0aGlzLnNldENhY2hlZFZhbHVlVG9Nb2RlbCh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q2FjaGVkVmFsdWVUb01vZGVsKG1vZGVsLCB1bmlxdWVLZXlDb250cm9sPywgcGF0aD8pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZCAhPSAnX2Vycm9ycycgJiYgZmllbGQgIT0gJ19zdGF0dXMnICYmIGZpZWxkICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlVuaXF1ZUtleUNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlS2V5Q29udHJvbCAhPSBudWxsICYmIHVuaXF1ZUtleUNvbnRyb2wgIT09ICcnKSBzdWJVbmlxdWVLZXlDb250cm9sID0gdW5pcXVlS2V5Q29udHJvbCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJVbmlxdWVLZXlDb250cm9sID0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbc3ViVW5pcXVlS2V5Q29udHJvbF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlBhdGg7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGggIT09ICcnKSBzdWJQYXRoID0gcGF0aCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJQYXRoID0gZmllbGQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBtb2RlbFtmaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN1Yk1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKGl0ZW0sIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGggKyAnWycgKyBpbmRleCArICddJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNMaXRlcmFsT2JqZWN0KHN1Yk1vZGVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHN1Yk1vZGVsLCBzdWJVbmlxdWVLZXlDb250cm9sLCBzdWJQYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuZW5hYmxlQ2FjaGluZyAmJiB0aGlzLmNhY2hlZFZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzdWJQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsW2ZpZWxkXSA9IHRoaXMuY2FjaGVkVmFsdWVzW3N1YlBhdGhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmIChjYWNoZWRWYWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY2FjaGVkVmFsdWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXMgPSBlbGVtZW50LnZhbHVlcztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDYWNoZVZhbHVlc1RvU3RvcmFnZSgpIHtcclxuICAgICAgICBsZXQgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmICghY2FjaGVkVmFsdWVzKSBjYWNoZWRWYWx1ZXMgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlcyA9IHRoaXMuY2FjaGVkVmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoTmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5jYWNoZWRWYWx1ZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVkVmFsdWVzJywgSlNPTi5zdHJpbmdpZnkoY2FjaGVkVmFsdWVzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgbnVsbCwgJ3RyaWdnZXInLCBjdXJyZW50Tm9kZS5wYXJlbnRNb2RlbCwgY3VycmVudE5vZGUucGFyZW50TW9kZWxQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvRm9jdXMgJiYgIXRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgODAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzTG9hZGVkRGF0YUVkaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0T2xkID0gdGhpcy5sb2FkZWREYXRhRWRpdDtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRyb2xUeXBlKGNvbnRyb2w6IGFueSkge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGl0bGVTY2hlbWEpIHJldHVybiAndGl0bGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWxTY2hlbWEpIHJldHVybiAnbGFiZWwnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3BhbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnc3BhbkNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHJldHVybiAnbWFzayc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnbnVtYmVycmFuZ2UnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRyb2wgPSA8VGV4dENvbnRyb2xTY2hlbWE+Y29udHJvbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdwaG9uZSdcclxuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdmYXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdwaG9uZU9yZmF4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRlbXBsYXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZW1wbGF0ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWVyYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkcm9wZG93bic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2VkaXRvcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbnRyb2xTY2hlbWEpIHJldHVybiAndGV4dGFyZWEnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb21tb24tcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUGjhuqNpIMSR4buDIGTDsm5nIGTGsOG7m2kg4bufIGLDqm4gdHLDqm4gVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgdsOsIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUtcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXItcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZW50aXR5LXBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnb3JnYW5pemF0aW9uLXBpY2tlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29jYXV0b2NodWMtcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb0NhdVRvQ2h1Y0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYSkgcmV0dXJuICdzd2l0Y2gnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEpIHJldHVybiAnY2hlY2tib3hsaXN0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdyYWRpb2J1dHRvbmxpc3QnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc2VydmljZUZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uQ29udHJvbFNjaGVtYSkgcmV0dXJuICdidXR0b24nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd2YW5iYW4nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2Nvbmd2aWVjJztcclxuICAgICAgICByZXR1cm4gJ2N1c3RvbSc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZpZXdNb2RlRGF0YVR5cGUoY29udHJvbCkge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGl0bGVTY2hlbWEpIHJldHVybiAndGl0bGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWxTY2hlbWEpIHJldHVybiAnbGFiZWwnO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbWFzayc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlQ29udHJvbCA9IDxEYXRlVGltZUNvbnRyb2xTY2hlbWE+Y29udHJvbDtcclxuICAgICAgICAgICAgaWYgKGRhdGVDb250cm9sLnNob3dUaW1lKSByZXR1cm4gJ2RhdGV0aW1lJztcclxuICAgICAgICAgICAgcmV0dXJuICdkYXRlJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2h0bWwnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndXNlcic7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2hhc0RhdGFTb3VyY2UnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVNlcnZpY2VVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FkZHJlc3MnO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgICYmIChjb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leSdcclxuICAgICAgICAgICAgICAgIHx8IGNvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50JylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdtb25leSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvckNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHJldHVybiAndGFibGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgS2V5VmFsdWVDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FwcC1rZXktdmFsdWUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29udGFpbmVyJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB2YWxpZGF0ZUZvcm0oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgdGhpcy5faW5WYWxpZEZvcm0gPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwodGhpcy5fcm9vdE5vZGUpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pblZhbGlkRm9ybSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1vZGVsKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghY2hpbGROb2RlLmNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGROb2RlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGROb2RlLmNvbnRyb2xbJ19oaWRkZW4nXSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudmFsaWRhdGUoY2hpbGROb2RlLCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5WYWxpZEZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwoY2hpbGROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBpZiAoY29udHJvbE5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbnRyb2xOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZURyb3Bkb3duKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gJ2hpZGUnKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgZXZlbnQsICdjaGFuZ2UnLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250cm9sLmJpbmRpbmdGaWx0ZXJzICYmIGV2ZW50VHlwZSA9PSAnY2hhbmdlJykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCAnY2hhbmdlJywgcGFyZW50TW9kZWwsIHBhcmVudFBhdGgsIHNvdXJjZU5vZGUsIGJ1YmJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50TW9kZWwsIHBhcmVudFBhdGgsIHNvdXJjZU5vZGUsIGJ1YmJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogxJDhu4Mgbmd1ecOqbiBow6BtIGThuqFuZyBhcnJvdyBmdW5jdGlvbiB2w6wgY8OzIDEgc+G7kSBmb3JtIGtow6FjIGfhu41pXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlID0gYXN5bmMgKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykgPT4ge1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGU7XHJcblxyXG4gICAgICAgIC8vIHJvdyBpbiB0YWJsZVxyXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIGF1dG8gY29ycmVjdCB2YWx1ZVxyXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xyXG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHZhbGlkYXRlIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZShjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgICAgIGlmICghYnViYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyZW50Tm9kZS5wYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5wYXJlbnROb2RlICE9IHBhcmVudE5vZGUucm9vdE5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKHBhcmVudE5vZGUuY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsLCBwYXJlbnROb2RlLnBhcmVudE5vZGUubW9kZWxQYXRoLCBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlQ29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZXZlbnREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogRXZlbnQga2hpIGRyb3Bkb3duIMSRaeG7gXUgY2jhu4luaCB2YWx1ZSB04burIHJhdyB2YWx1ZSBk4bqhbmcgZ3VpZCB8IGludCB8IC4uLiA9PiBvYmplY3Qga2nhu4N1IHt2YWx1ZTogZ3VpZCB8IGludCB8IC4uLiwgLi4uIFsxIHPhu5EgdHLGsOG7nW5nIGtow6FjXX1cclxuICAgICogQHBhcmFtIGNvbnRyb2xcclxuICAgICogQHBhcmFtIHBhcmVudFBhdGhcclxuICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlQWRqdXN0VmFsdWVEcm9wZG93bkV2ZW50KGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ2FkanVzdFZhbHVlJyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZShldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlRGF0YVNvdXJjZUxvYWRlZChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGgsIGRhdGFGcm9tRHJvcGRvd246IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdkYXRhU291cmNlTG9hZGVkJyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXMsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFGcm9tRHJvcGRvd24uZGF0YVNvdXJjZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGV2ZW50RGF0YVsnZWxtJ10gPSBkYXRhRnJvbURyb3Bkb3duLmVsbTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wuY2FsbGJhY2tEYXRhRmluaXNoKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaChldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVSZWFkeUNvbnRyb2xQaWNrZXIoY29udHJvbDogQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSB8IFVzZXJQaWNrZXJDb250cm9sU2NoZW1hIHwgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3JlYWR5JyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlYWR5KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVhZHkoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBwYXJlbnROb2RlLm1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub25Db250cm9sUmVhZHkuZW1pdChjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10pIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudFBhdGgpIHsgLy8gxJBv4bqhbiBjb2RlIHRyb25nIGJsb2NrIGlmIG7DoHkgY2jGsGEgY2h14bqpbiwgdOG6oW0gdGjhu51pIGNvZGUgdGjhur8gxJHhur9uIGtoaSBn4bq3cCBjYXNlIG7DoHkgdGjDrCB4ZW0gbOG6oWkgc2F1XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudFBhdGh9LiR7Y29udHJvbC5maWVsZH1gXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDYW5QcmludCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0NhblByaW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XSAmJiB0aGlzLmNhblByaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgd2FpdFJlYWR5QW5kUHJpbnQoKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZHlBbGwgPSB0aGlzLmNoZWNrUmVhZHlBbGwoKTtcclxuICAgICAgICBpZiAodGhpcy53YWl0UmVhZHlBbmRQcmludFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlYWR5QWxsKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XTtcclxuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByaW50UGRmQnlTY2hlbWEodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLCB0aGlzLl9taW5pbWl6ZWREYXRhLCB0aGlzLnNldHRpbmcuc2NoZW1hKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdU4bqhbyBmaWxlIHRow6BuaCBjw7RuZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEucHJpbnRGaWxlSWQgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVXYWl0Qm94KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWcuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRyaW5oS3koZW52aXJvbm1lbnQsIHRoaXMuc2V0dGluZywgdGhpcy5fbW9kZWxEYXRhLCByZXMuZGF0YSwgdGhpcy5fbm90aWZpZXJTZXJ2aWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BZnRlclRyaW5oS3kuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50KCk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbFRhYmxlID0gdGhpcy5mb3JtQ29udHJvbHNbY29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2xUYWJsZS5maWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1JlYWR5QWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5oaWRkZW4gfHwgIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcGFyZW50RmllbGQgPSBjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF07XHJcbiAgICAgICAgICAgIC8vIE7hur91IGzDoCBmaWVsZCB0cm9uZyB0YWJsZSBzY2hlbWFcclxuICAgICAgICAgICAgaWYgKHBhcmVudEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJNb2RlbEN1bmdMZXZlbCA9IHRoaXMuZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyTW9kZWxDdW5nTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyck1vZGVsQ3VuZ0xldmVsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtwYXJlbnRGaWVsZH1bJHtpfV0uJHtjb250cm9sLmZpZWxkfWBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucmVhZHlTdGF0dXNbYCR7Y29udHJvbC5maWVsZH1gXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZU1vZGVsRnJvbUV4dGVybmFsID0gKCkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyBleHBvcnQgcmEgY2hvIG3hu5l0IHPhu5EgdGVtcGxhdGUgc+G7rSBk4bulbmdcclxuICAgIGZpcmVNb2RlbENoYW5nZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlLmVtaXQodGhpcy5fbWluaW1pemVkRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUJ1dHRvbkNsaWNrKGNvbnRyb2w6IEJ1dHRvbkNvbnRyb2xTY2hlbWEsIGV2ZW50LCBwYXJlbnRQYXRoKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25DbGljaykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNsaWNrKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdjbGljaycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb3JyZWN0VmFsdWUoY3VycmVudE5vZGU6IENvbnRyb2xUcmVlTm9kZSkge1xyXG4gICAgICAgIGxldCByZSA9IGN1cnJlbnROb2RlLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuY29ycmVjdG9ycyAmJiBjb250cm9sLmNvcnJlY3RvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wuY29ycmVjdG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29ycmVjdG9yID0gY29udHJvbC5jb3JyZWN0b3JzW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnYXV0b0NvcnJlY3QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmUgPSBjb3JyZWN0b3IuY29ycmVjdChldmVudERhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRydWUgbMOgIHRo4buPYSBtw6NuLCBmYWxzZSBsw6Aga2jDtG5nIHRo4buPYSBtw6NuICjhu54gY+G6pXAgaGnhu4duIHThuqFpIGNo4bupIGNoxrBhIGtp4buDbSB0cmEgY+G6pXAgY29uKVxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZShjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gY3VycmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW2N1cnJlbnROb2RlLmZpZWxkXTtcclxuICAgICAgICAgICAgaWYgKCFlcnJvcnMpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBlcnJvcnMuc3BsaWNlKDAsIGVycm9ycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3JzICYmIGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbnRyb2wudmFsaWRhdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3ZhbGlkYXRlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdmFsaWRhdG9yLnZhbGlkYXRlKGV2ZW50RGF0YSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSB2YWxpZGF0b3IuZ2V0RXJyb3IoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuaW5kZXhPZihlcnIpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBfc2V0RXJyb3IoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykge1xyXG4gICAgLy8gICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkKTtcclxuICAgIC8vICAgICBpZiAobm9kZSA9PSBudWxsKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnVHLGsOG7nW5nIGThu68gbGnhu4d1IGtow7RuZyB04buTbiB04bqhaScpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGNvbnN0IGVycm9ycyA9IG5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW25vZGUuZmllbGRdO1xyXG4gICAgLy8gICAgIGVycm9ycy5wdXNoKGVycm9yKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzZXRFcnJvcihmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGVycm9yOiBzdHJpbmcpIHtcclxuICAgIC8vICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpXHJcbiAgICAvLyAgICAgICAgIGZpZWxkLmZvckVhY2goaXRlbSA9PiB0aGlzLl9zZXRFcnJvcihpdGVtLCBlcnJvcikpO1xyXG4gICAgLy8gICAgIGVsc2VcclxuICAgIC8vICAgICAgICAgdGhpcy5fc2V0RXJyb3IoZmllbGQsIGVycm9yKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIGNhY2hlQ29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlLCBwYXJlbnRQYXRoKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5lbmFibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVkVmFsdWVzW3BhcmVudFBhdGggKyAnLicgKyBjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnRCeVR5cGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXRoaXMudGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZmluZFRlbXBsYXRlRnJvbUxpc3QodGhpcy5jaGlsZHJlbiwgdGVtcGxhdGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzW3RlbXBsYXRlTmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEl0ZW1JbkFycmF5QnlWYWx1ZShhcnJheSwgdiwgY29udHJvbCkge1xyXG4gICAgICAgIGlmICh2ID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZnVuY0dldExhYmVsID0gY29udHJvbC5mdW5jR2V0TGFiZWw7XHJcbiAgICAgICAgaWYgKGZ1bmNHZXRMYWJlbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZ1bmNHZXRMYWJlbCA9IGl0ZW0gPT4gaXRlbVtjb250cm9sLmRpc3BsYXlGaWVsZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHZBcnIgPSB2O1xyXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodikpIHtcclxuICAgICAgICAgICAgICAgIHZBcnIgPSB2LnRvU3RyaW5nKCkuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZBcnIubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gYXJyYXkuZmluZCh4ID0+IHhbY29udHJvbC52YWx1ZUZpZWxkXSA9PSB2KTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmNHZXRMYWJlbChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2QXJyLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheS5maWx0ZXIocCA9PiB2QXJyLnNvbWUocSA9PiBxID09IHBbY29udHJvbC52YWx1ZUZpZWxkXSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChpdGVtID0+IGZ1bmNHZXRMYWJlbChpdGVtKSlcclxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SXRlbUluQXJyYXlCeVRleHRWYWx1ZShhcnJheSwgdikge1xyXG4gICAgICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBhcnJheSBpbnN0YW5jZW9mIEFycmF5XHJcbiAgICAgICAgICAgICYmIGFycmF5Lmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHYuam9pbignOyAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBZGRyZXNzRGlzcGxheVRleHQoc2VsZWN0ZWRWYWx1ZSkgeyB9XHJcblxyXG4gICAgcHVibGljIGdldExhYmVsQ2xhc3MoY29udHJvbCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBgbGFiZWwtY29udHJvbGA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuaW5kZXhMYWJlbCkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyBoYXZlSW5kZXgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9WaWV3KGVsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaDE6IGFueSA9IGVsZS5jbG9zZXN0KCdkaXZbaWQkPVxcJy1ob2xkZXJcXCddJyk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaDEgJiYgaDEucHJldmlvdXNTaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaDEgPSBoMS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGgxLnRhZ05hbWUgPT09ICdESVYnKSBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaDEgJiYgaDEuc2Nyb2xsSW50b1ZpZXcpIGgxLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIFNldCBGb2N1cyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAgICovXHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0Q29udHJvbCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBkaXZzID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2LmNydWQtZm9ybS1jb250cm9sJyk7XHJcbiAgICAgICAgaWYgKGRpdnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdERpdkhvbGRlciA9IGRpdjtcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSB0aGlzLmZpcnN0RGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Om5vdChbdHlwZT1maWxlXSk6bm90KFt0eXBlPWhpZGRlbl0pJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sICYmIGZpcnN0Q29udHJvbC5pZC5pbmRleE9mKCd0aW55LWFuZ3VsYXInKSAhPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnYm9keScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYGRpdi5lcnJvcmA7XHJcbiAgICAgICAgY29uc3QgZGl2SG9sZGVyID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICAgICAgaWYgKGRpdkhvbGRlcikge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGVudHMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2JvZHknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByZXZlbnRCbHVyKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhcEZvY3VzKSB7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgd2hpbGUgKHRhcmdldCB8fCB0YXJnZXQudGFnTmFtZSA9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaWQuZW5kc1dpdGgoJy1ob2xkZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT0gdGhpcy5maXJzdERpdkhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb250cm9sID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sID09IGV2ZW50LnRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmlzaWJsZShlbGVtKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xyXG4gICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoc3R5bGUudmlzaWJpbGl0eSAhPT0gJ3Zpc2libGUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCtzdHlsZS5vcGFjaXR5IDwgMC4xKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBlbGVtLm9mZnNldFdpZHRoXHJcbiAgICAgICAgICAgICsgZWxlbS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxyXG4gICAgICAgICAgICArIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcclxuICAgICAgICAgICAgPT09IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbGVtQ2VudGVyID0ge1xyXG4gICAgICAgICAgICB4OiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyBlbGVtLm9mZnNldFdpZHRoIC8gMixcclxuICAgICAgICAgICAgeTogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBlbGVtLm9mZnNldEhlaWdodCAvIDJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcG9pbnRDb250YWluZXIgPSA8YW55PihcclxuICAgICAgICAgICAgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlbGVtQ2VudGVyLngsIGVsZW1DZW50ZXIueSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChwb2ludENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRDb250YWluZXIgPT09IGVsZW0pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKChwb2ludENvbnRhaW5lciA9IHBvaW50Q29udGFpbmVyLnBhcmVudE5vZGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZUNvbmZpcm0oKS50aGVuKGFzeW5jIHJzID0+IHtcclxuICAgICAgICAgICAgaWYgKCFycykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlUm93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uRGVsZXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRvRGVsZXRlID0gY29udHJvbC5vbkRlbGV0aW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2RlbGV0aW5nJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0b0RlbGV0ZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uRGVsZXRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdkZWxldGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkTmV3Um93KGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgsIGV2ZW50VHlwZT8pIHtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFRow6ptIG3hu5tpICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudFJvdyA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgICAgIHRhYmxlUGF0aCxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG9BZGQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IGNvbnRyb2wub25BZGRpbmcobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICdhZGRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ3RhYmxlQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRNdWx0aVJvdyhjb250cm9sLCBsZW5ndGgsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hZGROZXdSb3coY29udHJvbCwgdGFibGVQYXRoLCBldmVudFR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVTYXZlZFRhYmxlUm93KGRhdGEpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby5jb250cm9sO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGF0aCA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8udGFibGVQYXRoO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8uZXZlbnRUeXBlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBpZiAodGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID4gLTEpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsW3RoaXMudGFibGVGb3JtQ3VycmVudFJvd10gPSB7IC4uLnRhYmxlTm9kZS5tb2RlbFt0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3ddLCAuLi5kYXRhIH07XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB0b0FkZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0b0FkZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Jvd05vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2F2ZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uU2F2ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vblNhdmUobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3NhdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFPhu61hICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2NoZW1hID0gY29udHJvbC5yb3dUZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSBpbmRleDtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgdG9EZWxldGVSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtRGF0YSA9IHRvRGVsZXRlUm93Tm9kZS52YWx1ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIGluZGV4XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVSb3dPcmRlcmVkKGNvbnRyb2w6IFRhYmxlU2NoZW1hLCBldnQsIGV2ZW50VHlwZT8sIHBhcmVudE1vZGVsPywgcGFyZW50UGF0aD8sIHNvdXJjZU5vZGU/LCBidWJibGU/KSB7XHJcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgLy8gcm93IGluIHRhYmxlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBwYXJlbnRNb2RlbCA9IHBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlb3JkZXJlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVvcmRlcmVkKGV2ZW50RGF0YSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0NvbnRleHRNZW51KGV2dCwgcm93RGF0YSwgY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLnJvd0RhdGFDdXJyZW50ID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gYXdhaXQgY29udHJvbC5yb3dCdXR0b25zKHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghdGhpcy5idXR0b25Db250ZXh0cyB8fCB0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hvd0NvbnRleHRNZW51KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldnQpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWVzc2FnZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uTWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbk1lc3NhZ2UobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ21lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUYWJsZUZ1bmN0aW9uQ29sdW1uV2lkdGgoY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICBsZXQgbmUgPSAyMDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RGVsZXRlKSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd1NhdmUpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnJvd0J1dHRvbnMpIG5lICs9IDMwO1xyXG4gICAgICAgIHJldHVybiBuZSArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE1hc2tCeVR5cGUobWFza1R5cGUpIHtcclxuICAgICAgICBpZiAobWFza1R5cGUgPT0gJ2RlY2ltYWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnZG90X3NlcGFyYXRvci41JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tEaXNhYmxlZChkYXRhOiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xyXG4gICAgICAgIHJldHVybiBkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHRydWUgfHwgKGRhdGEuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5kaXNhYmxlZCA9PT0gdW5kZWZpbmVkICYmIGNvbnRyb2wuZGlzYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSGlkZGVuKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50TW9kZWw6IGFueSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbnVsbDtcclxuICAgICAgICBpZiAocGF0aCAmJiBjb250cm9sWydub2RlcyddKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY29udHJvbFsnbm9kZXMnXVtwYXRoXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHtcclxuICAgICAgICAgICAgY29udHJvbFsnX2hpZGRlbiddID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0uaGlkZGVuID09PSB0cnVlXHJcbiAgICAgICAgICAgIHx8IChwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAmJiAoY29udHJvbC5oaWRkZW5cclxuICAgICAgICAgICAgICAgICAgICB8fCAoY29udHJvbC5oaWRkZW5DaGVjayAmJiBjb250cm9sLmhpZGRlbkNoZWNrKHRoaXMuX21pbmltaXplZERhdGEsIGN1cnJlbnROb2RlKSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICBjb250cm9sWydfaGlkZGVuJ10gPSAhIXJlc3VsdDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbnRleHRUZChjb250cm9sLCBkYXRhLCBpbmRleCwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgICAgIHRhYmxlUGF0aCxcclxuICAgICAgICAgICAgcGFyZW50UGF0aDogYCR7dGFibGVQYXRofVske2luZGV4fV1gLFxyXG4gICAgICAgICAgICBwYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XS4ke2NvbnRyb2wuZmllbGR9YCxcclxuICAgICAgICAgICAgc2hvd0xhYmVsOiBmYWxzZSxcclxuICAgICAgICAgICAgbWRXaWR0aDogMTJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc01vYmlsZU9yVGFibGV0KCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc01vYmlsZSgpXHJcbiAgICAgICAgICAgIHx8IHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc1RhYmxldCgpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVDYWNoZVZhbHVlc1RvU3RvcmFnZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRm9jdXNUZXh0Q29udHJvbChldnQpIHsgfVxyXG5cclxuICAgIHB1YmxpYyBvblNldHRpbmdzKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX09MREVTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXdlc3QoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVXRVNULCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU5leHQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX1BSRVYsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoKGV2dCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250cm9sRGF0YVNvdXJjZShjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgbW9kZWxQYXRoOiBzdHJpbmc7XHJcbiAgICBzY2hlbWFQYXRoOiBzdHJpbmc7XHJcbiAgICBmaWVsZDogc3RyaW5nO1xyXG4gICAgcGFyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIGNoaWxkTm9kZXM6IENvbnRyb2xUcmVlTm9kZVtdID0gW107XHJcbiAgICBjb250cm9sOiBGb3JtQ29udHJvbEJhc2U7XHJcbiAgICBmb3JtQ29udHJvbHM7XHJcbiAgICBrZXlzUGx1czogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9jcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBhbnk7XHJcbiAgICBwcml2YXRlIGhhc1NjaGVtYSA9IHRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwgZmllbGQ/LCBwYXJlbnROb2RlPzogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gbW9kZWw7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBzY2hlbWFzO1xyXG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm1vZGVsUGF0aCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gcGFyZW50Tm9kZS5tb2RlbFBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYVBhdGggPSBwYXJlbnROb2RlLnNjaGVtYVBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJ1snICsgZmllbGQgKyAnXSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU2NoZW1hID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSBwYXJlbnROb2RlLnJvb3ROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAodGhpcy5oYXNTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbFsnbm9kZXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sWydub2RlcyddW3RoaXMubW9kZWxQYXRoXSA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgIGxldCBrZXlzUGx1cyA9IFtdO1xyXG4gICAgICAgIGlmIChzY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBzY2hlbWEuY29udHJvbHMuZmlsdGVyKHEgPT4gcS5maWVsZCkubWFwKHEgPT4gcS5maWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLnJvd1RlbXBsYXRlLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hUGF0aCkge1xyXG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBPYmplY3Qua2V5cyhzY2hlbWFzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmtleXNQbHVzID0ga2V5c1BsdXM7XHJcbiAgICAgICAgdGhpcy5pbml0Q2hpbGROb2Rlcyhtb2RlbCwgc2NoZW1hcywga2V5c1BsdXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWluaXRDaGlsZE5vZGVzKCkge1xyXG4gICAgICAgIHRoaXMuY2hpbGROb2Rlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuY2hpbGROb2RlRGljID0ge307XHJcbiAgICAgICAgdGhpcy5pbml0Q2hpbGROb2Rlcyh0aGlzLmRhdGEsIHRoaXMuZm9ybUNvbnRyb2xzLCB0aGlzLmtleXNQbHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDaGlsZE5vZGVzKG1vZGVsOiBhbnksIHNjaGVtYXM6IFtdLCBrZXlzUGx1czogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhbGxLZXkgPSBuZXcgU2V0KFsuLi5rZXlzUGx1cywgLi4uT2JqZWN0LmtleXMobW9kZWwpXSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnICYmIGtleSAhPSBLZXlGbGFzaFNob3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKG1vZGVsW2tleV0sIHNjaGVtYXMsIGtleSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnB1c2goY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZURpY1tjaGlsZE5vZGUuZmllbGRdID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgaWYgKG1vZGVsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUoaXRlbSwgc2NoZW1hcywgaSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVEaWNbY2hpbGROb2RlLmZpZWxkXSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoaWxkTm9kZShmaWVsZCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlRGljW2ZpZWxkXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRDcnVkRm9ybShjcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLl9jcnVkRm9ybSA9IGNydWRGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRNb2RlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRNb2RlbFBhdGgoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbFBhdGg7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBhcmVudENvbnRyb2woKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2RlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF07XHJcbiAgICAgICAgZWxzZSByZXR1cm4gdGhpcy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBtb2RlbCh2YWwpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXSA9IHZhbDtcclxuICAgICAgICBlbHNlIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFsdWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgdmFsdWUodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF0gPSB2YWw7XHJcbiAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEhpZGRlbihmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcclxuICAgICAgICAgICAgZmllbGQuZm9yRWFjaChmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGlkZGVuRmllbGQoZiwgaGlkZGVuKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGZpZWxkLCBoaWRkZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEhpZGRlbkZpZWxkKGZpZWxkOiBzdHJpbmcsIGhpZGRlbjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCcuJykgPiAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgoYCR7dGhpcy5tb2RlbFBhdGh9LiR7ZmllbGR9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RGaWVsZCA9IGZpZWxkLnNwbGl0KCcuJykucG9wKCk7XHJcbiAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnROb2RlLmRhdGEuX3N0YXR1c1tsYXN0RmllbGRdLmhpZGRlbiA9IGhpZGRlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5fc3RhdHVzW2ZpZWxkXS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROb2RlQnlQYXRoKG1vZGVsUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG1vZGVsUGF0aCA9PSBudWxsIHx8IG1vZGVsUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRJblRyZWUodGhpcy5yb290Tm9kZSwgbW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROb2RlQnlTY2hlbWFQYXRoKHNjaGVtYVBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChzY2hlbWFQYXRoID09IG51bGwgfHwgc2NoZW1hUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRTY2hlbWFJblRyZWUodGhpcy5yb290Tm9kZSwgc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChub2RlLm1vZGVsUGF0aCAhPSBudWxsICYmIG5vZGUubW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkgPT0gbW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkpIHJldHVybiBub2RlO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUubW9kZWxQYXRoICE9IG51bGwgJiYgbW9kZWxQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gdGhpcy5maW5kSW5UcmVlKGNoaWxkTm9kZSwgbW9kZWxQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUpIHJldHVybiByZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRTY2hlbWFJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobm9kZS5zY2hlbWFQYXRoICE9IG51bGwgJiYgbm9kZS5zY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkgPT0gc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gbm9kZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLnNjaGVtYVBhdGggIT0gbnVsbCAmJiBzY2hlbWFQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLnNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZFNjaGVtYUluVHJlZShjaGlsZE5vZGUsIHNjaGVtYVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZSkgcmV0dXJuIHJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXREYXRhU291cmNlVGFibGVTY2hlbWEocGF0aDogc3RyaW5nLCBkYXRhU291cmNlOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5UGF0aChwYXRoKTtcclxuICAgICAgICBpZiAoIXRhYmxlTm9kZS5tb2RlbCkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRhYmxlTm9kZS5tb2RlbC5sZW5ndGggPiBkYXRhU291cmNlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwgPSB0YWJsZU5vZGUubW9kZWwuc3BsaWNlKGRhdGFTb3VyY2UubGVuZ3RoLCBkYXRhU291cmNlLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGVOb2RlLm1vZGVsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG1lcmdlSlNPTk9sZCh0YWJsZU5vZGUubW9kZWxbaV0sIGRhdGFTb3VyY2VbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRhYmxlTm9kZS5tb2RlbC5sZW5ndGg7IGkgPCBkYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUuX2NydWRGb3JtLmFkZE5ld1Jvdyg8VGFibGVTY2hlbWE+dGFibGVOb2RlLmNvbnRyb2wsIHBhdGgpO1xyXG4gICAgICAgICAgICBtZXJnZUpTT05PbGQodGFibGVOb2RlLm1vZGVsW2ldLCBkYXRhU291cmNlW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
2158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDWSxTQUFTLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFDNUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUNwRCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0gsb0JBQW9CLEVBQUUseUJBQXlCLEVBQUUsK0JBQStCLEVBQ2hGLG1CQUFtQixFQUFFLHFCQUFxQixFQUMxQyx5QkFBeUIsRUFBRSx3QkFBd0IsRUFDbkQsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQUUsZUFBZSxFQUFF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ICAgIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCAqIGFzIG5hbm9pZF8gZnJvbSAnbmFub2lkJztcclxuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2NvbnRleHRtZW51JztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XHJcbmltcG9ydCB7IEtleUZsYXNoU2hvdyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtcclxuICAgIEFkZHJlc3NDb250cm9sU2NoZW1hLCBBdXRvQ29tcGxldGVDb250cm9sU2NoZW1hLCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgQnV0dG9uQ29udHJvbFNjaGVtYSwgQ2hlY2tib3hDb250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSwgQ29DYXVUb0NodWNDb250cm9sU2NoZW1hLFxyXG4gICAgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hLCBDb2xvckNvbnRyb2xTY2hlbWEsIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSwgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hLCBDb250YWluZXJTY2hlbWEsIENydWRGb3JtU2V0dGluZyxcclxuICAgIERhdGVUaW1lQ29udHJvbFNjaGVtYSwgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsIERyb3Bkb3duQ29udHJvbFNjaGVtYSwgRWRpdG9yQ29udHJvbFNjaGVtYSwgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEV2ZW50RGF0YSwgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hLCBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSxcclxuICAgIEZpbGVVcGxvYWRNb2RlLFxyXG4gICAgRm9ybUNvbnRyb2xCYXNlLCBGb3JtU2NoZW1hQmFzZSxcclxuICAgIEtleVZhbHVlQ29udHJvbFNjaGVtYSwgTGFiZWxTY2hlbWEsIE1hc2tDb250cm9sU2NoZW1hLCBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEsIE9wZXJhdG9yLCBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgUG9wdXBTaXplLFxyXG4gICAgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSwgU3BhbkNvbnRyb2xTY2hlbWEsIFN3aXRjaENvbnRyb2xTY2hlbWEsIFRhYmxlU2NoZW1hLCBUZW1wbGF0ZUNvbnRyb2xTY2hlbWEsIFRleHRBcmVhQ29udHJvbFNjaGVtYSwgVGV4dENvbnRyb2xTY2hlbWEsXHJcbiAgICBUaXRsZVNjaGVtYSwgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEsIFZhbkJhblBpY2tlckNvbnRyb2xTY2hlbWEsIFdyYXBQaWNrZXJDb250cm9sU2NoZW1hXHJcbn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb21tb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5UGlja2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2VudGl0eS1waWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hc3RlckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFzdGVyLWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24vc2VydmljZXMvZHJvcGRvd24uc2VydmljZSc7XHJcbmltcG9ydCB7IGJhc2VUcmluaEt5IH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcclxuaW1wb3J0IHsgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IsIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yLCBDb21wYXJlVmFsaWRhdG9yLCBEYXRlQ29tcGFyZVZhbGlkYXRvciwgRW1haWxWYWxpZGF0b3IsIE51bWJlckNvbXBhcmVWYWxpZGF0b3IsIE51bWJlck9ubHlWYWxpZGF0b3IsIFBob25lTnVtYmVyVmFsaWRhdG9yLCBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvciwgUmVxdWlyZWRWYWxpZGF0b3IsIFNhbWVWYWx1ZVZhbGlkYXRvciB9IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL3ZhbGlkYXRvcnMnO1xyXG5pbXBvcnQgeyBpc0FycmF5LCBpc0xpdGVyYWxPYmplY3QsIG1lcmdlSlNPTiwgbWVyZ2VKU09OT2xkIH0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Vudmlyb25tZW50LXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5cclxuLy8gZml4IGZvciBidWlsZCBwcm9kXHJcbmNvbnN0IG5hbm9pZCA9IG5hbm9pZF87XHJcbmNvbnN0IGpRdWVyeSA9IGpRdWVyeV87XHJcblxyXG5kZWNsYXJlIHZhciB0aW55bWNlOiBhbnk7XHJcblxyXG5jb25zdCBvcGVyYXRvckNvbnRyYXN0ID0ge1xyXG4gICAgW09wZXJhdG9yLmdyZWF0ZXJdOiBPcGVyYXRvci5sb3dlcixcclxuICAgIFtPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXTogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXHJcbiAgICBbT3BlcmF0b3IubG93ZXJdOiBPcGVyYXRvci5ncmVhdGVyLFxyXG4gICAgW09wZXJhdG9yLmxvd2VyVGhhbkVxdWFsXTogT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbFxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NydWQtZm9ybScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NydWQtZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcnVkRm9ybUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICBAVmlld0NoaWxkKCdmb3JtRWxlbWVudCcpIGZvcm1FbGVtZW50OiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnUnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZVJlZikgY2hpbGRyZW46IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgICBASW5wdXQoKSBzZXR0aW5nOiBDcnVkRm9ybVNldHRpbmcgPSBuZXcgQ3J1ZEZvcm1TZXR0aW5nKCk7XHJcbiAgICBASW5wdXQoKSBjb250ZXh0OiBDb21wb25lbnRDb250ZXh0U2VydmljZTtcclxuXHJcbiAgICBASW5wdXQoKSBmaWxlc1VwbG9hZGVkID0gW107XHJcbiAgICBASW5wdXQoKSBpc1ZpZXdNb2RlID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlS2V5cHJlc3NDb250cm9sID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlQ2FjaGluZyA9IGZhbHNlO1xyXG4gICAgX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCc7XHJcbiAgICBASW5wdXQoKSBzZXQgc3R5bGVDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fc3R5bGVDbGFzcyA9ICdwLWZsdWlkJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEBJbnB1dCgpIGZvcm1JZCA9ICcnO1xyXG4gICAgQElucHV0KCkgZm9ybUNsYXNzID0gJyc7XHJcbiAgICBASW5wdXQoKSBhdXRvRm9jdXMgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgdHJhcEZvY3VzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHNldCBkYXRhKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmNhblByaW50ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX21pbmltaXplZERhdGEgIT0gdmFsdWUgJiYgaXNMaXRlcmFsT2JqZWN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RlbERhdGEgPSBtZXJnZUpTT04odGhpcy5fbW9kZWxEYXRhLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYW4oKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnbW9kZWxDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEodGhpcy5fbW9kZWxEYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWREYXRhRWRpdE9sZCAmJiB0aGlzLmxvYWRlZERhdGFFZGl0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhblByaW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDYW5QcmludCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ21vZGVsQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlZC5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25Gb3JtUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWxsQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZnRlclRyaW5oS3kgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBfcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIF9taW5pbWl6ZWREYXRhOiBhbnk7XHJcbiAgICBfbW9kZWxEYXRhOiBhbnkgPSB7fTtcclxuICAgIF91bnN1YnNjcmliZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIF9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIERvYyB0dSBjYXUgaGluaCB0aGFtIHNvIGhlIHRob25nXHJcbiAgICBsaW1pdFNpemUgPSAwO1xyXG4gICAgZm9ybUNvbnRyb2xzOiBhbnkgPSBbXTtcclxuICAgIGZ1bmNDaGVja1VuaXF1ZUZpZWxkOiBhbnkgPSB7fTtcclxuICAgIGJlZm9yZURhdGE6IGFueSA9IHt9O1xyXG4gICAgZmlyc3REaXZIb2xkZXI6IGFueTtcclxuICAgIGNhY2hlZFZhbHVlcyA9IHt9O1xyXG4gICAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfSA9IHt9O1xyXG4gICAgX3ByZWZpeEN1c3RvbUhlYWRlciA9ICdjdXN0b21IZWFkZXJfJztcclxuXHJcbiAgICBsb2FkZWREYXRhRWRpdE9sZCA9IGZhbHNlO1xyXG4gICAgbG9hZGVkRGF0YUVkaXQgPSBmYWxzZTtcclxuICAgIGNhblByaW50ID0gZmFsc2U7XHJcblxyXG4gICAgdGFibGVGb3JtU2hvdyA9IGZhbHNlO1xyXG4gICAgdGFibGVGb3JtVGl0bGU6IHN0cmluZztcclxuICAgIHRhYmxlRm9ybVBvcHVwU2l6ZSA9IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSk7XHJcbiAgICB0YWJsZUZvcm1EYXRhOiBhbnkgPSB7fTtcclxuICAgIHRhYmxlRm9ybUN1cnJlbnRSb3c6IG51bWJlcjtcclxuICAgIHRhYmxlRm9ybVNjaGVtYTogRm9ybVNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgdGFibGVGb3JtQ3VycmVudEluZm86IGFueSA9IHt9O1xyXG5cclxuICAgIGJ1dHRvbkNvbnRleHRzOiBNZW51SXRlbVtdID0gW107XHJcbiAgICByb3dEYXRhQ3VycmVudDogYW55ID0ge307XHJcbiAgICBjb250cm9sTmVlZENoZWNrUmVhZHk6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgIHJlYWR5U3RhdHVzOiBhbnkgPSB7fTtcclxuICAgIGZpZWxkUGFyZW50RmllbGQgPSAncGFyZW50RmllbGQnO1xyXG4gICAgd2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0OiBhbnk7XHJcblxyXG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcclxuICAgIHB1YmxpYyBfbWFzdGVyRGF0YVNlcnZpY2U6IE1hc3RlckRhdGFTZXJ2aWNlO1xyXG4gICAgcHVibGljIF91c2VyU2VydmljZTogVXNlclNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9kcm9wZG93blNlcnZpY2U6IERyb3Bkb3duU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgIHB1YmxpYyBfZW50aXR5UGlja2VyU2VydmljZTogRW50aXR5UGlja2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZ1NlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTWFzdGVyRGF0YVNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgLy8gR2V0IENvbmZpZ3VyYXRpb25TeXN0ZW1cclxuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZS5nZXRDb25maWdCeUNvZGUoJ1NpemVPZkZpbGUnKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbWl0U2l6ZSA9IE51bWJlcihyZXNwb25zZSkgKiAxMDAwICogMTAwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmhpZGRlblRyaW5oS3kpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgbmV3IEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3ByaW50RmlsZUlkJyxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IEZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuQ2hlY2s6IChtb2RlbCwgY3VycmVudE5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtb2RlbC5wcmludEZpbGVJZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0TG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFZpZXdNb2RlKHJlYWRvbmx5VmlldyA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLmlzVmlld01vZGUgPSByZWFkb25seVZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhbigpIHtcclxuICAgICAgICB0aGlzLmNsZWFuTW9kZWwodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsZWFuTW9kZWwobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX3N0YXR1cycpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgaW4gbW9kZWxba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFtrZXldW3NdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ19lcnJvcnMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxba2V5XVtzXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1pbmltaXplRGF0YShtb2RlbCkge1xyXG4gICAgICAgIGlmIChpc0xpdGVyYWxPYmplY3QobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5fZHJvcGRvd252YWx1ZSAhPSBudWxsICYmIG1vZGVsLl9kcm9wZG93bnZhbHVlICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW21vZGVsLl9kcm9wZG93bnZhbHVlXSB8fCBtb2RlbFsndmFsdWUnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE1pbmltaXplRGF0YShtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZ2V0TWluaW1pemVEYXRhKGl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNjaGVtYSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSB0aGlzLmFwcGx5Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdmb3JtUmVhZHknLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3Rvcihjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGjhu7FjIGhp4buHbiBzYXUgY8O5bmcga2hpIHThuqV0IGPhuqMgbW9kZWwgxJHDoyBpbml0IHhvbmdcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTXVsdGlSb3coY29udHJvbCwgYWRkTW9yZSwgX3BhcmVudFBhdGgsICdpbml0Jyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIC8vIGlmICghcGFyZW50TW9kZWwuaGFzT3duUHJvcGVydHkoY29udHJvbC5maWVsZCkgJiYgY29udHJvbC5maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIC8vICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIC8vICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbCwgY29udHJvbCwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgY29udHJvbC5maWVsZCk7XHJcblxyXG4gICAgICAgIGxldCBfcGFyZW50UGF0aCA9IGNvbnRyb2wuZmllbGQ7XHJcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZE1vcmUgPSBjb250cm9sLmluaXRSb3dDb3VudCAtIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGFkZE1vcmUgPiAwICYmICFwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKGl0ZW0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5oYXNPd25Qcm9wZXJ0eShjb250cm9sLmZpZWxkKSAmJiBjb250cm9sLmZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50Ll9oYXNMb2FkZWREYXRhc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWwubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWxbMF0udmFsdWVbY29udHJvbC52YWx1ZUZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGZpZWxkKSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc291cmNlKSBwYXJlbnRNb2RlbC5fc291cmNlID0ge307XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1cykgcGFyZW50TW9kZWwuX3N0YXR1cyA9IHt9O1xyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX2Vycm9ycykgcGFyZW50TW9kZWwuX2Vycm9ycyA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdKSBwYXJlbnRNb2RlbC5fc3RhdHVzW2ZpZWxkXSA9IHt9O1xyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX2Vycm9yc1tmaWVsZF0pIHBhcmVudE1vZGVsLl9lcnJvcnNbZmllbGRdID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbFNjaGVtYShzY2hlbWE6IEZvcm1TY2hlbWFCYXNlLCBwYXJlbnRJZD8pIHtcclxuICAgICAgICBpZiAoc2NoZW1hLmRpc2FibGVkICE9IHRydWUpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3TW9kZSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2NoZW1hLmxhYmVsICYmICFzY2hlbWEuZnVsbExhYmVsKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5mdWxsTGFiZWwgPSBzY2hlbWEubGFiZWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGl0bGVTY2hlbWFcclxuICAgICAgICAgICAgfHwgc2NoZW1hIGluc3RhbmNlb2YgTGFiZWxTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKCFzY2hlbWEuZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS5maWVsZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NoZW1hLmZpZWxkKSB7XHJcbiAgICAgICAgICAgIGxldCBrZXkgPSBzY2hlbWEuZmllbGQ7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRJZCAhPSBudWxsKSBrZXkgPSBwYXJlbnRJZCArICcuJyArIGtleTtcclxuICAgICAgICAgICAgc2NoZW1hLnVuaXF1ZUZpZWxkID0ga2V5O1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sc1trZXldID0gc2NoZW1hO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2NoZW1hWydjb250cm9sVHlwZSddID0gdGhpcy5nZXRDb250cm9sVHlwZShzY2hlbWEpO1xyXG4gICAgICAgIHNjaGVtYVsnZGF0YVR5cGUnXSA9IHRoaXMuZ2V0Vmlld01vZGVEYXRhVHlwZShzY2hlbWEpO1xyXG5cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJDb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF0gPSBjb250cm9sLnVuaXF1ZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShzdWJDb250cm9sLCBzY2hlbWEudW5pcXVlRmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmZpcmVDYWxsQmFja0luc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIWRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmxvYWRPbkluaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJQaWNrZXJDb250cm9sU2NoZW1hID0gPERyb3Bkb3duQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIHVzZXJQaWNrZXJDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgY29udHJvbC51bmlxdWVGaWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hID0gPEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmZpcmVDYWxsQmFja0luc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzY2hlbWE6IGFueSkge1xyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IHRtcEZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSkge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykgPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gYXdhaXQgZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0bXBGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlRmllbGQgPSBmaWx0ZXIuc291cmNlRmllbGQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gc291cmNlRmllbGQpO1xyXG4gICAgICAgICAgICBpZiAoIWZpbHRlci5zdWJGaWVsZFxyXG4gICAgICAgICAgICAgICAgJiYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSB8fCBzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnN1YkZpZWxkID0gc2NoZW1hLnZhbHVlRmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBtYXJrZWRDb250cm9sID0ge307XHJcbiAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGRyb3Bkb3duQ29udHJvbFNjaGVtYSwgdG1wRmlsdGVycywgbWFya2VkQ29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGNoaWxkRHJvcGRvd246IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsIHRtcEZpbHRlcnM6IEZpbHRlcltdLCBtYXJrZWRDb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHRtcEZpbHRlcnMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0bXBGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5mb3JtQ29udHJvbHNbc291cmNlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudERyb3Bkb3duICYmICFtYXJrZWRDb250cm9sW3NvdXJjZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVPbkNoYW5nZUV2ZW50KHBhcmVudERyb3Bkb3duLCAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lZWRHZXREYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5hbGxvd0xvYWREYXRhV2hlblBhcmVudE51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC5ldmVudFR5cGUgPT0gJ2FkanVzdFZhbHVlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnZhbHVlID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC52YWx1ZSA9PSAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChldmVudC52YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV2ZW50LnZhbHVlLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLl9jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LnJlc2V0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkR2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9jcnVkU2VydmljZS5nZXRGaWx0ZXJGcm9tVGVtcGxhdGUodG1wRmlsdGVycywgZXZlbnQucGFyZW50TW9kZWwsIGV2ZW50LnJvb3RNb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIShwYXJlbnREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmVudERyb3Bkb3duLl9jb21wb25lbnQgJiYgcGFyZW50RHJvcGRvd24uX2NvbXBvbmVudC5faGFzTG9hZGVkRGF0YXNvdXJjZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKGZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLl9jb21wb25lbnQgJiYgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93biwgZmlsdGVyLmZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTW9yZU9uQ2hhbmdlRXZlbnQoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBuZXdPbkNoYW5nZSkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkVHJpZ2dlckxvYWRDaGlsZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9sZFRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdG1wRmllbGRPbGRPbkNoYW5nZSA9ICdvbGRPbkNoYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbC5vbkNoYW5nZWQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gb2xkT25DaGFuZ2U7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRFdmVudCA9IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuY29ycmVjdG9ycykgc2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2hlbWEudmFsaWRhdG9ycykgc2NoZW1hLnZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5yZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBSZXF1aXJlZFZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRTY2hlbWEgPSAoPFRleHRDb250cm9sU2NoZW1hPnNjaGVtYSk7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ251bWJlcicgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdhbW91bnQnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgTnVtYmVyT25seVZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5JyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5aW50Jykge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2VtYWlsJykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGV4dFNjaGVtYS5jb3JyZWN0b3JzKSB0ZXh0U2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBHbWFpbENvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBMb3dlckNvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ3Bob25lJyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2ZheCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCB0ZXh0U2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3RvcihzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVTY2hlbWEgPSAoPERhdGVUaW1lQ29udHJvbFNjaGVtYT5zY2hlbWEpO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIGRhdGVUaW1lU2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvci5zZXRCYXNlU2VydmljZSh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWEsIHZhbGlkYXRvci5nZXREdXBsaWNhdGVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFJlcXVpcmVkRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFNhbWVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KFxyXG4gICAgICAgIHZhbGlkYXRvcjogRGF0ZUNvbXBhcmVWYWxpZGF0b3IgfCBOdW1iZXJDb21wYXJlVmFsaWRhdG9yLFxyXG4gICAgICAgIHNjaGVtYTogRGF0ZVRpbWVDb250cm9sU2NoZW1hIHwgVGV4dENvbnRyb2xTY2hlbWEgfCBNYXNrQ29udHJvbFNjaGVtYVxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgY29tcGFyZVVuaXF1ZUZpZWxkID0gdmFsaWRhdG9yLmNvbXBhcmVVbmlxdWVGaWVsZDtcclxuICAgICAgICBpZiAoc2NoZW1hLnVuaXF1ZUZpZWxkID09IGNvbXBhcmVVbmlxdWVGaWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBvcGVyYXRvckNvbXBhcmUgPSB2YWxpZGF0b3IuZ2V0T3BlcmF0b3JDb21wYXJlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBhcmUgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tjb21wYXJlVW5pcXVlRmllbGRdKTtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYUNvbXBhcmUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFDb21wYXJlLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBDb21wYXJlVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgcC5jb21wYXJlVW5pcXVlRmllbGQgPT0gc2NoZW1hLnVuaXF1ZUZpZWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBEYXRlQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFDb21wYXJlLnZhbGlkYXRvcnMucHVzaChuZXcgRGF0ZUNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldER1cGxpY2F0ZUZpZWxkcygpKSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICBfdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFJlcXVpcmVkRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNhbWVWYWx1ZVZhbGlkYXRvcnMoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFNhbWVGaWVsZHMoKSkpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdmFsaWRhdG9yID0gbmV3IFNhbWVWYWx1ZVZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RGF0YURlZmF1bHQoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xyXG4gICAgICAgIGNvbnN0IGdldFNldHRpbmdEYXRhRGVmYXVsdCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5zZXR0aW5nRGF0YURlZmF1bHQ7XHJcbiAgICAgICAgaWYgKHN0cmluZ0RhdGFEZWZhdWx0ICYmICh0aGlzLl9tb2RlbERhdGEgJiYgIXRoaXMuX21vZGVsRGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPERyb3Bkb3duQ29udHJvbFNjaGVtYT5pdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSAoY29udHJvbC5maWVsZCArIChjb250cm9sLnZhbHVlRmllbGQgPT0gJ2lkJyA/ICcnIDogY29udHJvbC52YWx1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YUNhY2hlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRTZXR0aW5nRGF0YURlZmF1bHQpIHsgLy8gbOG6pXkgY+G6pXUgaMOsbmggZmllbGQgbWFwUGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1hcEdldENhY2hlID0gZ2V0U2V0dGluZ0RhdGFEZWZhdWx0W2NvbnRyb2wuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRNYXBHZXRDYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGZpZWxkTWFwR2V0Q2FjaGUgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVsoPEZvcm1TY2hlbWFCYXNlPml0ZW0pLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5Q2FjaGVkVmFsdWVzKCkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKTtcclxuICAgICAgICB0aGlzLnNldENhY2hlZFZhbHVlVG9Nb2RlbCh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q2FjaGVkVmFsdWVUb01vZGVsKG1vZGVsLCB1bmlxdWVLZXlDb250cm9sPywgcGF0aD8pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZCAhPSAnX2Vycm9ycycgJiYgZmllbGQgIT0gJ19zdGF0dXMnICYmIGZpZWxkICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlVuaXF1ZUtleUNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlS2V5Q29udHJvbCAhPSBudWxsICYmIHVuaXF1ZUtleUNvbnRyb2wgIT09ICcnKSBzdWJVbmlxdWVLZXlDb250cm9sID0gdW5pcXVlS2V5Q29udHJvbCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJVbmlxdWVLZXlDb250cm9sID0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbc3ViVW5pcXVlS2V5Q29udHJvbF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlBhdGg7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGggIT09ICcnKSBzdWJQYXRoID0gcGF0aCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJQYXRoID0gZmllbGQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBtb2RlbFtmaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN1Yk1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKGl0ZW0sIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGggKyAnWycgKyBpbmRleCArICddJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNMaXRlcmFsT2JqZWN0KHN1Yk1vZGVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHN1Yk1vZGVsLCBzdWJVbmlxdWVLZXlDb250cm9sLCBzdWJQYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuZW5hYmxlQ2FjaGluZyAmJiB0aGlzLmNhY2hlZFZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzdWJQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsW2ZpZWxkXSA9IHRoaXMuY2FjaGVkVmFsdWVzW3N1YlBhdGhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmIChjYWNoZWRWYWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY2FjaGVkVmFsdWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXMgPSBlbGVtZW50LnZhbHVlcztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDYWNoZVZhbHVlc1RvU3RvcmFnZSgpIHtcclxuICAgICAgICBsZXQgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmICghY2FjaGVkVmFsdWVzKSBjYWNoZWRWYWx1ZXMgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlcyA9IHRoaXMuY2FjaGVkVmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoTmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5jYWNoZWRWYWx1ZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVkVmFsdWVzJywgSlNPTi5zdHJpbmdpZnkoY2FjaGVkVmFsdWVzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgbnVsbCwgJ3RyaWdnZXInLCBjdXJyZW50Tm9kZS5wYXJlbnRNb2RlbCwgY3VycmVudE5vZGUucGFyZW50TW9kZWxQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvRm9jdXMgJiYgIXRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgODAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzTG9hZGVkRGF0YUVkaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0T2xkID0gdGhpcy5sb2FkZWREYXRhRWRpdDtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRyb2xUeXBlKGNvbnRyb2w6IGFueSkge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGl0bGVTY2hlbWEpIHJldHVybiAndGl0bGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWxTY2hlbWEpIHJldHVybiAnbGFiZWwnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3BhbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnc3BhbkNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHJldHVybiAnbWFzayc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnbnVtYmVycmFuZ2UnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRyb2wgPSA8VGV4dENvbnRyb2xTY2hlbWE+Y29udHJvbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdwaG9uZSdcclxuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdmYXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdwaG9uZU9yZmF4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRlbXBsYXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZW1wbGF0ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWVyYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkcm9wZG93bic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2VkaXRvcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbnRyb2xTY2hlbWEpIHJldHVybiAndGV4dGFyZWEnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb21tb24tcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUGjhuqNpIMSR4buDIGTDsm5nIGTGsOG7m2kg4bufIGLDqm4gdHLDqm4gVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgdsOsIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUtcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXItcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZW50aXR5LXBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnb3JnYW5pemF0aW9uLXBpY2tlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29jYXV0b2NodWMtcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb0NhdVRvQ2h1Y0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYSkgcmV0dXJuICdzd2l0Y2gnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEpIHJldHVybiAnY2hlY2tib3hsaXN0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdyYWRpb2J1dHRvbmxpc3QnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc2VydmljZUZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uQ29udHJvbFNjaGVtYSkgcmV0dXJuICdidXR0b24nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd2YW5iYW4nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2Nvbmd2aWVjJztcclxuICAgICAgICByZXR1cm4gJ2N1c3RvbSc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZpZXdNb2RlRGF0YVR5cGUoY29udHJvbCkge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGl0bGVTY2hlbWEpIHJldHVybiAndGl0bGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWxTY2hlbWEpIHJldHVybiAnbGFiZWwnO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbWFzayc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlQ29udHJvbCA9IDxEYXRlVGltZUNvbnRyb2xTY2hlbWE+Y29udHJvbDtcclxuICAgICAgICAgICAgaWYgKGRhdGVDb250cm9sLnNob3dUaW1lKSByZXR1cm4gJ2RhdGV0aW1lJztcclxuICAgICAgICAgICAgcmV0dXJuICdkYXRlJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2h0bWwnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndXNlcic7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2hhc0RhdGFTb3VyY2UnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVNlcnZpY2VVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FkZHJlc3MnO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgICYmIChjb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leSdcclxuICAgICAgICAgICAgICAgIHx8IGNvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50JylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdtb25leSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvckNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHJldHVybiAndGFibGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgS2V5VmFsdWVDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FwcC1rZXktdmFsdWUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29udGFpbmVyJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB2YWxpZGF0ZUZvcm0oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgdGhpcy5faW5WYWxpZEZvcm0gPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwodGhpcy5fcm9vdE5vZGUpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pblZhbGlkRm9ybSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1vZGVsKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghY2hpbGROb2RlLmNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGROb2RlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGROb2RlLmNvbnRyb2xbJ19oaWRkZW4nXSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudmFsaWRhdGUoY2hpbGROb2RlLCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5WYWxpZEZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwoY2hpbGROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBpZiAoY29udHJvbE5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbnRyb2xOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZURyb3Bkb3duKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gJ2hpZGUnKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgZXZlbnQsICdjaGFuZ2UnLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250cm9sLmJpbmRpbmdGaWx0ZXJzICYmIGV2ZW50VHlwZSA9PSAnY2hhbmdlJykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCAnY2hhbmdlJywgcGFyZW50TW9kZWwsIHBhcmVudFBhdGgsIHNvdXJjZU5vZGUsIGJ1YmJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50TW9kZWwsIHBhcmVudFBhdGgsIHNvdXJjZU5vZGUsIGJ1YmJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogxJDhu4Mgbmd1ecOqbiBow6BtIGThuqFuZyBhcnJvdyBmdW5jdGlvbiB2w6wgY8OzIDEgc+G7kSBmb3JtIGtow6FjIGfhu41pXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlID0gYXN5bmMgKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykgPT4ge1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGU7XHJcblxyXG4gICAgICAgIC8vIHJvdyBpbiB0YWJsZVxyXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIGF1dG8gY29ycmVjdCB2YWx1ZVxyXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xyXG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHZhbGlkYXRlIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZShjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgICAgIGlmICghYnViYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyZW50Tm9kZS5wYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5wYXJlbnROb2RlICE9IHBhcmVudE5vZGUucm9vdE5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKHBhcmVudE5vZGUuY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsLCBwYXJlbnROb2RlLnBhcmVudE5vZGUubW9kZWxQYXRoLCBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlQ29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZXZlbnREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogRXZlbnQga2hpIGRyb3Bkb3duIMSRaeG7gXUgY2jhu4luaCB2YWx1ZSB04burIHJhdyB2YWx1ZSBk4bqhbmcgZ3VpZCB8IGludCB8IC4uLiA9PiBvYmplY3Qga2nhu4N1IHt2YWx1ZTogZ3VpZCB8IGludCB8IC4uLiwgLi4uIFsxIHPhu5EgdHLGsOG7nW5nIGtow6FjXX1cclxuICAgICogQHBhcmFtIGNvbnRyb2xcclxuICAgICogQHBhcmFtIHBhcmVudFBhdGhcclxuICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlQWRqdXN0VmFsdWVEcm9wZG93bkV2ZW50KGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ2FkanVzdFZhbHVlJyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZShldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlRGF0YVNvdXJjZUxvYWRlZChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGgsIGRhdGFGcm9tRHJvcGRvd246IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdkYXRhU291cmNlTG9hZGVkJyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXMsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFGcm9tRHJvcGRvd24uZGF0YVNvdXJjZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGV2ZW50RGF0YVsnZWxtJ10gPSBkYXRhRnJvbURyb3Bkb3duLmVsbTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wuY2FsbGJhY2tEYXRhRmluaXNoKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaChldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVSZWFkeUNvbnRyb2xQaWNrZXIoY29udHJvbDogQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSB8IFVzZXJQaWNrZXJDb250cm9sU2NoZW1hIHwgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3JlYWR5JyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlYWR5KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVhZHkoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBwYXJlbnROb2RlLm1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub25Db250cm9sUmVhZHkuZW1pdChjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10pIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudFBhdGgpIHsgLy8gxJBv4bqhbiBjb2RlIHRyb25nIGJsb2NrIGlmIG7DoHkgY2jGsGEgY2h14bqpbiwgdOG6oW0gdGjhu51pIGNvZGUgdGjhur8gxJHhur9uIGtoaSBn4bq3cCBjYXNlIG7DoHkgdGjDrCB4ZW0gbOG6oWkgc2F1XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudFBhdGh9LiR7Y29udHJvbC5maWVsZH1gXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDYW5QcmludCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0NhblByaW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XSAmJiB0aGlzLmNhblByaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgd2FpdFJlYWR5QW5kUHJpbnQoKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZHlBbGwgPSB0aGlzLmNoZWNrUmVhZHlBbGwoKTtcclxuICAgICAgICBpZiAodGhpcy53YWl0UmVhZHlBbmRQcmludFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlYWR5QWxsKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XTtcclxuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByaW50UGRmQnlTY2hlbWEodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLCB0aGlzLl9taW5pbWl6ZWREYXRhLCB0aGlzLnNldHRpbmcuc2NoZW1hKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdU4bqhbyBmaWxlIHRow6BuaCBjw7RuZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEucHJpbnRGaWxlSWQgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVXYWl0Qm94KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWcuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRyaW5oS3koZW52aXJvbm1lbnQsIHRoaXMuc2V0dGluZywgdGhpcy5fbW9kZWxEYXRhLCByZXMuZGF0YSwgdGhpcy5fbm90aWZpZXJTZXJ2aWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BZnRlclRyaW5oS3kuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50KCk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbFRhYmxlID0gdGhpcy5mb3JtQ29udHJvbHNbY29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2xUYWJsZS5maWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1JlYWR5QWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5oaWRkZW4gfHwgIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcGFyZW50RmllbGQgPSBjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF07XHJcbiAgICAgICAgICAgIC8vIE7hur91IGzDoCBmaWVsZCB0cm9uZyB0YWJsZSBzY2hlbWFcclxuICAgICAgICAgICAgaWYgKHBhcmVudEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJNb2RlbEN1bmdMZXZlbCA9IHRoaXMuZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyTW9kZWxDdW5nTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyck1vZGVsQ3VuZ0xldmVsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtwYXJlbnRGaWVsZH1bJHtpfV0uJHtjb250cm9sLmZpZWxkfWBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucmVhZHlTdGF0dXNbYCR7Y29udHJvbC5maWVsZH1gXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZU1vZGVsRnJvbUV4dGVybmFsID0gKCkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyBleHBvcnQgcmEgY2hvIG3hu5l0IHPhu5EgdGVtcGxhdGUgc+G7rSBk4bulbmdcclxuICAgIGZpcmVNb2RlbENoYW5nZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlLmVtaXQodGhpcy5fbWluaW1pemVkRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUJ1dHRvbkNsaWNrKGNvbnRyb2w6IEJ1dHRvbkNvbnRyb2xTY2hlbWEsIGV2ZW50LCBwYXJlbnRQYXRoKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25DbGljaykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNsaWNrKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdjbGljaycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb3JyZWN0VmFsdWUoY3VycmVudE5vZGU6IENvbnRyb2xUcmVlTm9kZSkge1xyXG4gICAgICAgIGxldCByZSA9IGN1cnJlbnROb2RlLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuY29ycmVjdG9ycyAmJiBjb250cm9sLmNvcnJlY3RvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wuY29ycmVjdG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29ycmVjdG9yID0gY29udHJvbC5jb3JyZWN0b3JzW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnYXV0b0NvcnJlY3QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmUgPSBjb3JyZWN0b3IuY29ycmVjdChldmVudERhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRydWUgbMOgIHRo4buPYSBtw6NuLCBmYWxzZSBsw6Aga2jDtG5nIHRo4buPYSBtw6NuICjhu54gY+G6pXAgaGnhu4duIHThuqFpIGNo4bupIGNoxrBhIGtp4buDbSB0cmEgY+G6pXAgY29uKVxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZShjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gY3VycmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW2N1cnJlbnROb2RlLmZpZWxkXTtcclxuICAgICAgICAgICAgaWYgKCFlcnJvcnMpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBlcnJvcnMuc3BsaWNlKDAsIGVycm9ycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3JzICYmIGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbnRyb2wudmFsaWRhdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3ZhbGlkYXRlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdmFsaWRhdG9yLnZhbGlkYXRlKGV2ZW50RGF0YSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSB2YWxpZGF0b3IuZ2V0RXJyb3IoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuaW5kZXhPZihlcnIpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBfc2V0RXJyb3IoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykge1xyXG4gICAgLy8gICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkKTtcclxuICAgIC8vICAgICBpZiAobm9kZSA9PSBudWxsKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnVHLGsOG7nW5nIGThu68gbGnhu4d1IGtow7RuZyB04buTbiB04bqhaScpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGNvbnN0IGVycm9ycyA9IG5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW25vZGUuZmllbGRdO1xyXG4gICAgLy8gICAgIGVycm9ycy5wdXNoKGVycm9yKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzZXRFcnJvcihmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGVycm9yOiBzdHJpbmcpIHtcclxuICAgIC8vICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpXHJcbiAgICAvLyAgICAgICAgIGZpZWxkLmZvckVhY2goaXRlbSA9PiB0aGlzLl9zZXRFcnJvcihpdGVtLCBlcnJvcikpO1xyXG4gICAgLy8gICAgIGVsc2VcclxuICAgIC8vICAgICAgICAgdGhpcy5fc2V0RXJyb3IoZmllbGQsIGVycm9yKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIGNhY2hlQ29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlLCBwYXJlbnRQYXRoKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5lbmFibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVkVmFsdWVzW3BhcmVudFBhdGggKyAnLicgKyBjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnRCeVR5cGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXRoaXMudGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZmluZFRlbXBsYXRlRnJvbUxpc3QodGhpcy5jaGlsZHJlbiwgdGVtcGxhdGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzW3RlbXBsYXRlTmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEl0ZW1JbkFycmF5QnlWYWx1ZShhcnJheSwgdiwgY29udHJvbCkge1xyXG4gICAgICAgIGlmICh2ID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZnVuY0dldExhYmVsID0gY29udHJvbC5mdW5jR2V0TGFiZWw7XHJcbiAgICAgICAgaWYgKGZ1bmNHZXRMYWJlbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZ1bmNHZXRMYWJlbCA9IGl0ZW0gPT4gaXRlbVtjb250cm9sLmRpc3BsYXlGaWVsZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHZBcnIgPSB2O1xyXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodikpIHtcclxuICAgICAgICAgICAgICAgIHZBcnIgPSB2LnRvU3RyaW5nKCkuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZBcnIubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gYXJyYXkuZmluZCh4ID0+IHhbY29udHJvbC52YWx1ZUZpZWxkXSA9PSB2KTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmNHZXRMYWJlbChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2QXJyLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheS5maWx0ZXIocCA9PiB2QXJyLnNvbWUocSA9PiBxID09IHBbY29udHJvbC52YWx1ZUZpZWxkXSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChpdGVtID0+IGZ1bmNHZXRMYWJlbChpdGVtKSlcclxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SXRlbUluQXJyYXlCeVRleHRWYWx1ZShhcnJheSwgdikge1xyXG4gICAgICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBhcnJheSBpbnN0YW5jZW9mIEFycmF5XHJcbiAgICAgICAgICAgICYmIGFycmF5Lmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHYuam9pbignOyAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBZGRyZXNzRGlzcGxheVRleHQoc2VsZWN0ZWRWYWx1ZSkgeyB9XHJcblxyXG4gICAgcHVibGljIGdldExhYmVsQ2xhc3MoY29udHJvbCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBgbGFiZWwtY29udHJvbGA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuaW5kZXhMYWJlbCkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyBoYXZlSW5kZXgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9WaWV3KGVsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaDE6IGFueSA9IGVsZS5jbG9zZXN0KCdkaXZbaWQkPVxcJy1ob2xkZXJcXCddJyk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaDEgJiYgaDEucHJldmlvdXNTaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaDEgPSBoMS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGgxLnRhZ05hbWUgPT09ICdESVYnKSBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaDEgJiYgaDEuc2Nyb2xsSW50b1ZpZXcpIGgxLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIFNldCBGb2N1cyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAgICovXHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0Q29udHJvbCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBkaXZzID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2LmNydWQtZm9ybS1jb250cm9sJyk7XHJcbiAgICAgICAgaWYgKGRpdnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdERpdkhvbGRlciA9IGRpdjtcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSB0aGlzLmZpcnN0RGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Om5vdChbdHlwZT1maWxlXSk6bm90KFt0eXBlPWhpZGRlbl0pJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sICYmIGZpcnN0Q29udHJvbC5pZC5pbmRleE9mKCd0aW55LWFuZ3VsYXInKSAhPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnYm9keScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYGRpdi5lcnJvcmA7XHJcbiAgICAgICAgY29uc3QgZGl2SG9sZGVyID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICAgICAgaWYgKGRpdkhvbGRlcikge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGVudHMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2JvZHknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByZXZlbnRCbHVyKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhcEZvY3VzKSB7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgd2hpbGUgKHRhcmdldCB8fCB0YXJnZXQudGFnTmFtZSA9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaWQuZW5kc1dpdGgoJy1ob2xkZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT0gdGhpcy5maXJzdERpdkhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb250cm9sID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sID09IGV2ZW50LnRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmlzaWJsZShlbGVtKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xyXG4gICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoc3R5bGUudmlzaWJpbGl0eSAhPT0gJ3Zpc2libGUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCtzdHlsZS5vcGFjaXR5IDwgMC4xKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBlbGVtLm9mZnNldFdpZHRoXHJcbiAgICAgICAgICAgICsgZWxlbS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxyXG4gICAgICAgICAgICArIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcclxuICAgICAgICAgICAgPT09IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbGVtQ2VudGVyID0ge1xyXG4gICAgICAgICAgICB4OiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyBlbGVtLm9mZnNldFdpZHRoIC8gMixcclxuICAgICAgICAgICAgeTogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBlbGVtLm9mZnNldEhlaWdodCAvIDJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcG9pbnRDb250YWluZXIgPSA8YW55PihcclxuICAgICAgICAgICAgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlbGVtQ2VudGVyLngsIGVsZW1DZW50ZXIueSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChwb2ludENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRDb250YWluZXIgPT09IGVsZW0pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKChwb2ludENvbnRhaW5lciA9IHBvaW50Q29udGFpbmVyLnBhcmVudE5vZGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZUNvbmZpcm0oKS50aGVuKGFzeW5jIHJzID0+IHtcclxuICAgICAgICAgICAgaWYgKCFycykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlUm93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uRGVsZXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRvRGVsZXRlID0gY29udHJvbC5vbkRlbGV0aW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2RlbGV0aW5nJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0b0RlbGV0ZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uRGVsZXRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdkZWxldGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkTmV3Um93KGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgsIGV2ZW50VHlwZT8pIHtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFRow6ptIG3hu5tpICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudFJvdyA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgICAgIHRhYmxlUGF0aCxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG9BZGQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IGNvbnRyb2wub25BZGRpbmcobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICdhZGRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ3RhYmxlQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRNdWx0aVJvdyhjb250cm9sLCBsZW5ndGgsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hZGROZXdSb3coY29udHJvbCwgdGFibGVQYXRoLCBldmVudFR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVTYXZlZFRhYmxlUm93KGRhdGEpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby5jb250cm9sO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGF0aCA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8udGFibGVQYXRoO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8uZXZlbnRUeXBlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBpZiAodGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID4gLTEpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsW3RoaXMudGFibGVGb3JtQ3VycmVudFJvd10gPSB7IC4uLnRhYmxlTm9kZS5tb2RlbFt0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3ddLCAuLi5kYXRhIH07XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB0b0FkZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0b0FkZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Jvd05vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2F2ZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uU2F2ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vblNhdmUobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3NhdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFPhu61hICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2NoZW1hID0gY29udHJvbC5yb3dUZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSBpbmRleDtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgdG9EZWxldGVSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtRGF0YSA9IHRvRGVsZXRlUm93Tm9kZS52YWx1ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIGluZGV4XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVSb3dPcmRlcmVkKGNvbnRyb2w6IFRhYmxlU2NoZW1hLCBldnQsIGV2ZW50VHlwZT8sIHBhcmVudE1vZGVsPywgcGFyZW50UGF0aD8sIHNvdXJjZU5vZGU/LCBidWJibGU/KSB7XHJcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgLy8gcm93IGluIHRhYmxlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBwYXJlbnRNb2RlbCA9IHBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlb3JkZXJlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVvcmRlcmVkKGV2ZW50RGF0YSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0NvbnRleHRNZW51KGV2dCwgcm93RGF0YSwgY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLnJvd0RhdGFDdXJyZW50ID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gYXdhaXQgY29udHJvbC5yb3dCdXR0b25zKHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghdGhpcy5idXR0b25Db250ZXh0cyB8fCB0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hvd0NvbnRleHRNZW51KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldnQpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWVzc2FnZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uTWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbk1lc3NhZ2UobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ21lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUYWJsZUZ1bmN0aW9uQ29sdW1uV2lkdGgoY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICBsZXQgbmUgPSAyMDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RGVsZXRlKSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd1NhdmUpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnJvd0J1dHRvbnMpIG5lICs9IDMwO1xyXG4gICAgICAgIHJldHVybiBuZSArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE1hc2tCeVR5cGUobWFza1R5cGUpIHtcclxuICAgICAgICBpZiAobWFza1R5cGUgPT0gJ2RlY2ltYWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnZG90X3NlcGFyYXRvci41JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tEaXNhYmxlZChkYXRhOiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xyXG4gICAgICAgIHJldHVybiBkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHRydWUgfHwgKGRhdGEuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5kaXNhYmxlZCA9PT0gdW5kZWZpbmVkICYmIGNvbnRyb2wuZGlzYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSGlkZGVuKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50TW9kZWw6IGFueSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbnVsbDtcclxuICAgICAgICBpZiAocGF0aCAmJiBjb250cm9sWydub2RlcyddKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY29udHJvbFsnbm9kZXMnXVtwYXRoXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHtcclxuICAgICAgICAgICAgY29udHJvbFsnX2hpZGRlbiddID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0uaGlkZGVuID09PSB0cnVlXHJcbiAgICAgICAgICAgIHx8IChwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAmJiAoY29udHJvbC5oaWRkZW5cclxuICAgICAgICAgICAgICAgICAgICB8fCAoY29udHJvbC5oaWRkZW5DaGVjayAmJiBjb250cm9sLmhpZGRlbkNoZWNrKHRoaXMuX21pbmltaXplZERhdGEsIGN1cnJlbnROb2RlKSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICBjb250cm9sWydfaGlkZGVuJ10gPSAhIXJlc3VsdDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbnRleHRUZChjb250cm9sLCBkYXRhLCBpbmRleCwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgICAgIHRhYmxlUGF0aCxcclxuICAgICAgICAgICAgcGFyZW50UGF0aDogYCR7dGFibGVQYXRofVske2luZGV4fV1gLFxyXG4gICAgICAgICAgICBwYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XS4ke2NvbnRyb2wuZmllbGR9YCxcclxuICAgICAgICAgICAgc2hvd0xhYmVsOiBmYWxzZSxcclxuICAgICAgICAgICAgbWRXaWR0aDogMTJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc01vYmlsZU9yVGFibGV0KCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc01vYmlsZSgpXHJcbiAgICAgICAgICAgIHx8IHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc1RhYmxldCgpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVDYWNoZVZhbHVlc1RvU3RvcmFnZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRm9jdXNUZXh0Q29udHJvbChldnQpIHsgfVxyXG5cclxuICAgIHB1YmxpYyBvblNldHRpbmdzKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX09MREVTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXdlc3QoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVXRVNULCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU5leHQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX1BSRVYsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoKGV2dCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250cm9sRGF0YVNvdXJjZShjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgbW9kZWxQYXRoOiBzdHJpbmc7XHJcbiAgICBzY2hlbWFQYXRoOiBzdHJpbmc7XHJcbiAgICBmaWVsZDogc3RyaW5nO1xyXG4gICAgcGFyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIGNoaWxkTm9kZXM6IENvbnRyb2xUcmVlTm9kZVtdID0gW107XHJcbiAgICBjb250cm9sOiBGb3JtQ29udHJvbEJhc2U7XHJcbiAgICBmb3JtQ29udHJvbHM7XHJcbiAgICBrZXlzUGx1czogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9jcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBhbnk7XHJcbiAgICBwcml2YXRlIGhhc1NjaGVtYSA9IHRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwgZmllbGQ/LCBwYXJlbnROb2RlPzogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gbW9kZWw7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBzY2hlbWFzO1xyXG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm1vZGVsUGF0aCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gcGFyZW50Tm9kZS5tb2RlbFBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYVBhdGggPSBwYXJlbnROb2RlLnNjaGVtYVBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJ1snICsgZmllbGQgKyAnXSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU2NoZW1hID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSBwYXJlbnROb2RlLnJvb3ROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAodGhpcy5oYXNTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbFsnbm9kZXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sWydub2RlcyddW3RoaXMubW9kZWxQYXRoXSA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgIGxldCBrZXlzUGx1cyA9IFtdO1xyXG4gICAgICAgIGlmIChzY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBzY2hlbWEuY29udHJvbHMuZmlsdGVyKHEgPT4gcS5maWVsZCkubWFwKHEgPT4gcS5maWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLnJvd1RlbXBsYXRlLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hUGF0aCkge1xyXG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBPYmplY3Qua2V5cyhzY2hlbWFzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmtleXNQbHVzID0ga2V5c1BsdXM7XHJcbiAgICAgICAgdGhpcy5pbml0Q2hpbGROb2Rlcyhtb2RlbCwgc2NoZW1hcywga2V5c1BsdXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWluaXRDaGlsZE5vZGVzKCkge1xyXG4gICAgICAgIHRoaXMuY2hpbGROb2Rlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuY2hpbGROb2RlRGljID0ge307XHJcbiAgICAgICAgdGhpcy5pbml0Q2hpbGROb2Rlcyh0aGlzLmRhdGEsIHRoaXMuZm9ybUNvbnRyb2xzLCB0aGlzLmtleXNQbHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDaGlsZE5vZGVzKG1vZGVsOiBhbnksIHNjaGVtYXM6IFtdLCBrZXlzUGx1czogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhbGxLZXkgPSBuZXcgU2V0KFsuLi5rZXlzUGx1cywgLi4uT2JqZWN0LmtleXMobW9kZWwpXSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnICYmIGtleSAhPSBLZXlGbGFzaFNob3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKG1vZGVsW2tleV0sIHNjaGVtYXMsIGtleSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnB1c2goY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZURpY1tjaGlsZE5vZGUuZmllbGRdID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgaWYgKG1vZGVsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUoaXRlbSwgc2NoZW1hcywgaSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVEaWNbY2hpbGROb2RlLmZpZWxkXSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoaWxkTm9kZShmaWVsZCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlRGljW2ZpZWxkXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRDcnVkRm9ybShjcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLl9jcnVkRm9ybSA9IGNydWRGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRNb2RlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRNb2RlbFBhdGgoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbFBhdGg7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBhcmVudENvbnRyb2woKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2RlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF07XHJcbiAgICAgICAgZWxzZSByZXR1cm4gdGhpcy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBtb2RlbCh2YWwpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXSA9IHZhbDtcclxuICAgICAgICBlbHNlIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFsdWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgdmFsdWUodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF0gPSB2YWw7XHJcbiAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEhpZGRlbihmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcclxuICAgICAgICAgICAgZmllbGQuZm9yRWFjaChmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGlkZGVuRmllbGQoZiwgaGlkZGVuKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGZpZWxkLCBoaWRkZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEhpZGRlbkZpZWxkKGZpZWxkOiBzdHJpbmcsIGhpZGRlbjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCcuJykgPiAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgoYCR7dGhpcy5tb2RlbFBhdGh9LiR7ZmllbGR9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RGaWVsZCA9IGZpZWxkLnNwbGl0KCcuJykucG9wKCk7XHJcbiAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnROb2RlLmRhdGEuX3N0YXR1c1tsYXN0RmllbGRdLmhpZGRlbiA9IGhpZGRlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5fc3RhdHVzW2ZpZWxkXS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROb2RlQnlQYXRoKG1vZGVsUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG1vZGVsUGF0aCA9PSBudWxsIHx8IG1vZGVsUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRJblRyZWUodGhpcy5yb290Tm9kZSwgbW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROb2RlQnlTY2hlbWFQYXRoKHNjaGVtYVBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChzY2hlbWFQYXRoID09IG51bGwgfHwgc2NoZW1hUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRTY2hlbWFJblRyZWUodGhpcy5yb290Tm9kZSwgc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChub2RlLm1vZGVsUGF0aCAhPSBudWxsICYmIG5vZGUubW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkgPT0gbW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkpIHJldHVybiBub2RlO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUubW9kZWxQYXRoICE9IG51bGwgJiYgbW9kZWxQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gdGhpcy5maW5kSW5UcmVlKGNoaWxkTm9kZSwgbW9kZWxQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUpIHJldHVybiByZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRTY2hlbWFJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobm9kZS5zY2hlbWFQYXRoICE9IG51bGwgJiYgbm9kZS5zY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkgPT0gc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gbm9kZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLnNjaGVtYVBhdGggIT0gbnVsbCAmJiBzY2hlbWFQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLnNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZFNjaGVtYUluVHJlZShjaGlsZE5vZGUsIHNjaGVtYVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZSkgcmV0dXJuIHJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXREYXRhU291cmNlVGFibGVTY2hlbWEocGF0aDogc3RyaW5nLCBkYXRhU291cmNlOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5UGF0aChwYXRoKTtcclxuICAgICAgICBpZiAoIXRhYmxlTm9kZS5tb2RlbCkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRhYmxlTm9kZS5tb2RlbC5sZW5ndGggPiBkYXRhU291cmNlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwgPSB0YWJsZU5vZGUubW9kZWwuc3BsaWNlKGRhdGFTb3VyY2UubGVuZ3RoLCBkYXRhU291cmNlLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGVOb2RlLm1vZGVsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG1lcmdlSlNPTk9sZCh0YWJsZU5vZGUubW9kZWxbaV0sIGRhdGFTb3VyY2VbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRhYmxlTm9kZS5tb2RlbC5sZW5ndGg7IGkgPCBkYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUuX2NydWRGb3JtLmFkZE5ld1Jvdyg8VGFibGVTY2hlbWE+dGFibGVOb2RlLmNvbnRyb2wsIHBhdGgpO1xyXG4gICAgICAgICAgICBtZXJnZUpTT05PbGQodGFibGVOb2RlLm1vZGVsW2ldLCBkYXRhU291cmNlW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
|