@spicainternational/ngx-sds-components 7.3.1 → 7.3.2

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.
@@ -120,6 +120,7 @@ export class SdsDatePickerComponent {
120
120
  cancel: 'Cancel',
121
121
  apply: 'Apply',
122
122
  custom: 'Custom',
123
+ presets: 'Presets',
123
124
  };
124
125
  this.customDateRange = new PeriodPickerDateRange(this.translations.custom, undefined, undefined);
125
126
  this.selectedDateRange = this.customDateRange;
@@ -732,10 +733,10 @@ export class SdsDatePickerComponent {
732
733
  }
733
734
  }
734
735
  SdsDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SdsDatePickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SdsDatePickerService }], target: i0.ɵɵFactoryTarget.Component });
735
- SdsDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SdsDatePickerComponent, selector: "sds-date-picker", inputs: { selectionKind: "selectionKind", dateRangeDefinitions: "dateRangeDefinitions", selectedDate: "selectedDate", selectedDateStart: "selectedDateStart", singleDayFormatFn: "singleDayFormatFn", dateRangeFormatFn: "dateRangeFormatFn", selectedDateEnd: "selectedDateEnd", minDate: "minDate", maxDate: "maxDate", locales: "locales", disabled: "disabled", validationError: "validationError", isValid: "isValid", disabledDates: "disabledDates", applyText: "applyText", cancelText: "cancelText", translations: "translations", firstDayOfWeek: "firstDayOfWeek", dateRangeDefinitionsWidth: "dateRangeDefinitionsWidth", showPreviousAndNextButtons: "showPreviousAndNextButtons", width: "width", dropdownWrapperClass: "dropdownWrapperClass", dropdownWrapperId: "dropdownWrapperId", getPreviousDateCallback: "getPreviousDateCallback", getNextDateCallback: "getNextDateCallback", getPreviousRangeCallback: "getPreviousRangeCallback", getNextRangeCallback: "getNextRangeCallback", useCustomDisplayContent: "useCustomDisplayContent", displayPredefinedDateRangeName: "displayPredefinedDateRangeName", style: "style", compactStyleDisplay: "compactStyleDisplay", dateInputDisplayFormat: "dateInputDisplayFormat", componentAriaLabel: "componentAriaLabel", openDateRangeDefinitionsAriaLabel: "openDateRangeDefinitionsAriaLabel", nextPeriodAriaLabel: "nextPeriodAriaLabel", previousPeriodAriaLabel: "previousPeriodAriaLabel", lockBeforeDate: "lockBeforeDate", lockBeforeDateHint: "lockBeforeDateHint" }, outputs: { selectedDateChange: "selectedDateChange", selectedDateStartChange: "selectedDateStartChange", selectedDateEndChange: "selectedDateEndChange", periodChange: "periodChange" }, queries: [{ propertyName: "displayContent", first: true, predicate: ["display"], descendants: true }], viewQueries: [{ propertyName: "singleDatePickerBox", first: true, predicate: ["singleDatePickerBox"], descendants: true }, { propertyName: "selectedDateStartBox", first: true, predicate: ["selectedDateStartBox"], descendants: true }, { propertyName: "selectedDateEndBox", first: true, predicate: ["selectedDateEndBox"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "_selectedDateRangeButton", first: true, predicate: ["selectedDateRangeButton"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div class=\"px-3 py-2\">\r\n <label>Presets</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"], dependencies: [{ kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: i5.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "todayButtonText", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "todayButtonTextChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxoAnimationComponent, selector: "dxo-animation", inputs: ["hide", "show", "duration", "easing", "enabled", "maxPointCountSupported", "complete", "delay", "direction", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i6.DxoHideComponent, selector: "dxo-hide", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i6.DxoShowComponent, selector: "dxo-show", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i5.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i5.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i5.DxCalendarComponent, selector: "dx-calendar", inputs: ["accessKey", "activeStateEnabled", "cellTemplate", "dateSerializationFormat", "disabled", "disabledDates", "elementAttr", "firstDayOfWeek", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isValid", "max", "maxZoomLevel", "min", "minZoomLevel", "name", "readOnly", "rtlEnabled", "showTodayButton", "showWeekNumbers", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "weekNumberRule", "width", "zoomLevel"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "cellTemplateChange", "dateSerializationFormatChange", "disabledChange", "disabledDatesChange", "elementAttrChange", "firstDayOfWeekChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isValidChange", "maxChange", "maxZoomLevelChange", "minChange", "minZoomLevelChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "showTodayButtonChange", "showWeekNumbersChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "weekNumberRuleChange", "widthChange", "zoomLevelChange", "onBlur"] }, { kind: "pipe", type: i8.SdsDateComparePipe, name: "sdsDateCompare" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
736
+ SdsDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SdsDatePickerComponent, selector: "sds-date-picker", inputs: { selectionKind: "selectionKind", dateRangeDefinitions: "dateRangeDefinitions", selectedDate: "selectedDate", selectedDateStart: "selectedDateStart", singleDayFormatFn: "singleDayFormatFn", dateRangeFormatFn: "dateRangeFormatFn", selectedDateEnd: "selectedDateEnd", minDate: "minDate", maxDate: "maxDate", locales: "locales", disabled: "disabled", validationError: "validationError", isValid: "isValid", disabledDates: "disabledDates", applyText: "applyText", cancelText: "cancelText", translations: "translations", firstDayOfWeek: "firstDayOfWeek", dateRangeDefinitionsWidth: "dateRangeDefinitionsWidth", showPreviousAndNextButtons: "showPreviousAndNextButtons", width: "width", dropdownWrapperClass: "dropdownWrapperClass", dropdownWrapperId: "dropdownWrapperId", getPreviousDateCallback: "getPreviousDateCallback", getNextDateCallback: "getNextDateCallback", getPreviousRangeCallback: "getPreviousRangeCallback", getNextRangeCallback: "getNextRangeCallback", useCustomDisplayContent: "useCustomDisplayContent", displayPredefinedDateRangeName: "displayPredefinedDateRangeName", style: "style", compactStyleDisplay: "compactStyleDisplay", dateInputDisplayFormat: "dateInputDisplayFormat", componentAriaLabel: "componentAriaLabel", openDateRangeDefinitionsAriaLabel: "openDateRangeDefinitionsAriaLabel", nextPeriodAriaLabel: "nextPeriodAriaLabel", previousPeriodAriaLabel: "previousPeriodAriaLabel", lockBeforeDate: "lockBeforeDate", lockBeforeDateHint: "lockBeforeDateHint" }, outputs: { selectedDateChange: "selectedDateChange", selectedDateStartChange: "selectedDateStartChange", selectedDateEndChange: "selectedDateEndChange", periodChange: "periodChange" }, queries: [{ propertyName: "displayContent", first: true, predicate: ["display"], descendants: true }], viewQueries: [{ propertyName: "singleDatePickerBox", first: true, predicate: ["singleDatePickerBox"], descendants: true }, { propertyName: "selectedDateStartBox", first: true, predicate: ["selectedDateStartBox"], descendants: true }, { propertyName: "selectedDateEndBox", first: true, predicate: ["selectedDateEndBox"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "_selectedDateRangeButton", first: true, predicate: ["selectedDateRangeButton"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div\r\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\r\n <label>{{ translations.presets }}</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"], dependencies: [{ kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: i5.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "todayButtonText", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "todayButtonTextChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxoAnimationComponent, selector: "dxo-animation", inputs: ["hide", "show", "duration", "easing", "enabled", "maxPointCountSupported", "complete", "delay", "direction", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i6.DxoHideComponent, selector: "dxo-hide", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i6.DxoShowComponent, selector: "dxo-show", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i5.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i5.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i5.DxCalendarComponent, selector: "dx-calendar", inputs: ["accessKey", "activeStateEnabled", "cellTemplate", "dateSerializationFormat", "disabled", "disabledDates", "elementAttr", "firstDayOfWeek", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isValid", "max", "maxZoomLevel", "min", "minZoomLevel", "name", "readOnly", "rtlEnabled", "showTodayButton", "showWeekNumbers", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "weekNumberRule", "width", "zoomLevel"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "cellTemplateChange", "dateSerializationFormatChange", "disabledChange", "disabledDatesChange", "elementAttrChange", "firstDayOfWeekChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isValidChange", "maxChange", "maxZoomLevelChange", "minChange", "minZoomLevelChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "showTodayButtonChange", "showWeekNumbersChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "weekNumberRuleChange", "widthChange", "zoomLevelChange", "onBlur"] }, { kind: "pipe", type: i8.SdsDateComparePipe, name: "sdsDateCompare" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
736
737
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SdsDatePickerComponent, decorators: [{
737
738
  type: Component,
738
- args: [{ selector: 'sds-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div class=\"px-3 py-2\">\r\n <label>Presets</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"] }]
739
+ args: [{ selector: 'sds-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div\r\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\r\n <label>{{ translations.presets }}</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"] }]
739
740
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SdsDatePickerService }]; }, propDecorators: { displayContent: [{
740
741
  type: ContentChild,
741
742
  args: ['display']
@@ -839,4 +840,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
839
840
  type: ViewChild,
840
841
  args: ['selectedDateRangeButton', { static: true }]
841
842
  }] } });
842
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sRUFDUCxRQUFRLEVBQ1IsR0FBRyxHQUNOLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEUsT0FBTyxFQUNILHFCQUFxQixHQUd4QixNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7O0FBRzdCLDZEQUE2RDtBQVE3RCxNQUFNLE9BQU8sc0JBQXNCO0lBd0ovQixpQkFBaUI7SUFDakIsWUFDWSxTQUE0QixFQUM1QixpQkFBdUM7UUFEdkMsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQTFKMUIsbUJBQWMsR0FBUSxTQUFTLENBQUM7UUFFekQsbUJB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QkFBakMsS0FBSztnQkE4Q0UsbUJBQW1CO3NCQUQxQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHM0Msb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHNUMsa0JBQWtCO3NCQUR6QixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHQSxRQUFRO3NCQUF6RCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBS2hDLHdCQUF3QjtzQkFEL0IsU0FBUzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDb250ZW50Q2hpbGQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEeENhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL2NhbGVuZGFyJztcclxuaW1wb3J0IHsgRHhEYXRlQm94Q29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL2RhdGUtYm94JztcclxuaW1wb3J0IHsgbG9jYWxlIH0gZnJvbSBcImRldmV4dHJlbWUvbG9jYWxpemF0aW9uXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgaXNTYW1lRGF5LFxyXG4gICAgaXNTYW1lWWVhcixcclxuICAgIGlzU2FtZU1vbnRoLFxyXG4gICAgc3RhcnRPZkRheSxcclxuICAgIHN0YXJ0T2ZNb250aCxcclxuICAgIGVuZE9mTW9udGgsXHJcbiAgICBpc0FmdGVyLFxyXG4gICAgaXNCZWZvcmUsXHJcbiAgICBhZGQsXHJcbn0gZnJvbSAnZGF0ZS1mbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGZhQW5nbGVMZWZ0LFxyXG4gICAgZmFBbmdsZVJpZ2h0LFxyXG4gICAgZmFDYWxlbmRhcixcclxuICAgIGZhTG9ja1xyXG59IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tcmVndWxhci1zdmctaWNvbnMnO1xyXG5cclxuaW1wb3J0IHsgZmFBcnJvd1JpZ2h0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL3Byby1saWdodC1zdmctaWNvbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIFBlcmlvZFBpY2tlckRhdGVSYW5nZSxcclxuICAgIFBlcmlvZFBpY2tlckRhdGVSYW5nZURlZmluaXRpb24sXHJcbiAgICBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnMsXHJcbn0gZnJvbSAnLi9kYXRlLXBpY2tlci5tb2RlbCc7XHJcbmltcG9ydCB7IFNkc0RhdGVQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZHMtZGF0ZS1waWNrZXIuc2VydmljZSc7XHJcblxyXG4vLyBpbXBvcnQgeyBmYUxvY2sgfSBmcm9tICdAZm9ydGF3ZXNvbWUvcHJvLXNvbGlkLXN2Zy1pY29ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc2RzLWRhdGUtcGlja2VyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZHNEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gICAgQENvbnRlbnRDaGlsZCgnZGlzcGxheScpIGRpc3BsYXlDb250ZW50OiBhbnkgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gcHVibGljIGludGVyZmFjZVxyXG4gICAgQElucHV0KCkgc2VsZWN0aW9uS2luZDogJ3BlcmlvZCcgfCAnc2luZ2xlJyA9ICdwZXJpb2QnO1xyXG5cclxuICAgIEBJbnB1dCgpIGRhdGVSYW5nZURlZmluaXRpb25zOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uPiA9IFtdO1xyXG5cclxuICAgIC8vIHNpbmdsZSBkYXRlIHNlbGVjdG9yXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgLy8gcGVyaW9kIHNlbGVjdG9yXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGVTdGFydDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZERhdGVTdGFydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICAvLyBmb3JtYXQgZnVuY3Rpb24gZm9yIGRpc3BsYXlpbmcgZGF0ZSB3aGVuIHNpbmdsZSBkYXRlIGlzIHNlbGVjdGVkXHJcbiAgICBASW5wdXQoKSBzaW5nbGVEYXlGb3JtYXRGbjogKChkYXRlOiBEYXRlKSA9PiBzdHJpbmcgKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIC8vIGZvcm1hdCBmdW5jdGlvbiBmb3IgZGlzcGxheWluZyBlYWNoIGRhdGUgd2hlbiBkYXRlIHJhbmdlIGlzIHNlbGVjdGVkXHJcbiAgICBASW5wdXQoKSBkYXRlUmFuZ2VGb3JtYXRGbjogKChkYXRlOiBEYXRlKSA9PiBzdHJpbmcgKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGVFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGU7XHJcbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWREYXRlRW5kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHBlcmlvZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBASW5wdXQoKSBtaW5EYXRlPzogRGF0ZTtcclxuICAgIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xyXG5cclxuICAgIEBJbnB1dCgpIGxvY2FsZXM/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+O1xyXG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHZhbGlkYXRpb25FcnJvcjogc3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYXBwbHlUZXh0Pzogc3RyaW5nID0gJ2Nsb3NlJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjYW5jZWxUZXh0Pzogc3RyaW5nID0gJ2Nsb3NlJztcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdHJhbnNsYXRpb25zOiBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnM7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGZpcnN0RGF5T2ZXZWVrOiAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2ID0gMTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0ZVJhbmdlRGVmaW5pdGlvbnNXaWR0aDogc3RyaW5nID0gJzExcmVtJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHdpZHRoOiBzdHJpbmcgPSAnMzByZW0nO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93bldyYXBwZXJDbGFzczogc3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25XcmFwcGVySWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXRQcmV2aW91c0RhdGVDYWxsYmFjazogKGN1cnJlbnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gdGhpcy5nZXRQcmV2aW91c0RheTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXROZXh0RGF0ZUNhbGxiYWNrOiAoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSB0aGlzLmdldE5leHREYXk7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGdldFByZXZpb3VzUmFuZ2VDYWxsYmFjazogKGN1cnJlbnRTdGFydERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGN1cnJlbnRFbmREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA9PiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0gPSB0aGlzLmdldFByZXZpb3VzUmFuZ2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0TmV4dFJhbmdlQ2FsbGJhY2s6IChjdXJyZW50U3RhcnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBjdXJyZW50RW5kRGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkgPT4gW3N0cmluZyB8IG51bWJlciB8IERhdGUsIHN0cmluZyB8IG51bWJlciB8IERhdGVdID0gdGhpcy5nZXROZXh0UmFuZ2U7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHVzZUN1c3RvbURpc3BsYXlDb250ZW50ID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGRpc3BsYXlQcmVkZWZpbmVkRGF0ZVJhbmdlTmFtZSA9IGZhbHNlXHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHN0eWxlOiAnY2xhc3NpYycgfCAnY29tcGFjdCcgPSAnY2xhc3NpYyc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY29tcGFjdFN0eWxlRGlzcGxheTogJ2RhdGUnIHwgJ3ByZWRlZmluZWRSYW5nZScgfCAnYm90aCcgPSAncHJlZGVmaW5lZFJhbmdlJztcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0ZUlucHV0RGlzcGxheUZvcm1hdDogc3RyaW5nID0gJ3Nob3J0RGF0ZSc7XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBBcmlhIGlucHV0c1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIENvbXBvbmVudCBhcmlhLWxhYmVsLiBEZWZhdWx0cyB0byAnRGF0ZSBwaWNrZXInXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnRBcmlhTGFiZWwgPSAnRGF0ZSBwaWNrZXInXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIFByZWRlZmluZWQgZGF0ZSByYW5nZSBkZWZpbml0aW9ucyBkcm9wZG93biBidXR0b24gYXJpYS1sYWJlbC4gRGVmYXVsdHMgdG8gJ09wZW4gcHJlZGVmaW5lZCBkYXRlIHJhbmdlcyBwYW5lJ1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgb3BlbkRhdGVSYW5nZURlZmluaXRpb25zQXJpYUxhYmVsID0gJ09wZW4gcHJlZGVmaW5lZCBkYXRlIHJhbmdlcyBwYW5lJ1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBOZXh0IHBlcmlvZCBidXR0b24gYXJpYS1sYWJlbC4gRGVmYXVsdCB0byAnTmV4dCBwZXJpb2QnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBuZXh0UGVyaW9kQXJpYUxhYmVsID0gJ05leHQgcGVyaW9kJ1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBQcmV2aW91cyBwZXJpb2QgYnV0dG9uIGFyaWEtbGFiZWwuIERlZmF1bHRzIHRvICdQcmV2aW91cyBwZXJpb2QnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmV2aW91c1BlcmlvZEFyaWFMYWJlbCA9ICdQcmV2aW91cyBwZXJpb2QnXHJcblxyXG4gICAgLy8gI2VuZHJlZ2lvbiBBUklBIGlucHV0c1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2NrQmVmb3JlRGF0ZT86IERhdGU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9ja0JlZm9yZURhdGVIaW50Pzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvLyBwdWJsaWMgcHJvcGVydGllc1xyXG4gICAgcHJldmlvdXNQZXJpb2RJY29uID0gZmFBbmdsZUxlZnQ7XHJcbiAgICBuZXh0UGVyaW9kSWNvbiA9IGZhQW5nbGVSaWdodDtcclxuICAgIGNhbGVuZGFySWNvbiA9IGZhQ2FsZW5kYXI7XHJcbiAgICB0b0ljb24gPSBmYUFycm93UmlnaHQ7XHJcbiAgICBsb2NrSWNvbiA9IGZhTG9jaztcclxuXHJcbiAgICBwcmVkZWZpbmVkRGF0ZVJhbmdlczogQXJyYXk8UGVyaW9kUGlja2VyRGF0ZVJhbmdlPiA9IFtdO1xyXG4gICAgcHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2U6IFBlcmlvZFBpY2tlckRhdGVSYW5nZTtcclxuICAgIGRhdGVSYW5nZXM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZT4gPSBbXTtcclxuXHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZU5hbWU6IHN0cmluZyA9ICcnO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDE6IHN0cmluZyA9ICcnO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIG1pbkRhdGVEZWZhdWx0OiBEYXRlO1xyXG4gICAgbWF4RGF0ZURlZmF1bHQ6IERhdGU7XHJcblxyXG4gICAgc2VsZWN0ZWREYXRlQ2FsZW5kYXI6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgc2VsZWN0ZWREYXRlSW50ZXJuYWw6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGRhdGVTdGFydE9sZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9ICcnO1xyXG4gICAgZGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kT2xkOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcblxyXG4gICAgc2hvd0RhdGVwaWNrZXI6IGJvb2xlYW47XHJcbiAgICBzaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGhpZGluZ0NvbmZpcm1lZERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc2VsZWN0ZWREYXRlRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHByb3RlY3RlZCBlbGVtZW50VVVJRCA9ICdzZHMtYXMtJyArIGNyeXB0by5yYW5kb21VVUlEKCk7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBmaWVsZHNcclxuICAgIHByaXZhdGUgY3VzdG9tRGF0ZVJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2U7XHJcbiAgICBwcml2YXRlIGluaXRDYWxlbmRhclZhbHVlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzaW5nbGVEYXRlUGlja2VyQm94JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgICBwcml2YXRlIHNpbmdsZURhdGVQaWNrZXJCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkRGF0ZVN0YXJ0Qm94JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgICBwcml2YXRlIHNlbGVjdGVkRGF0ZVN0YXJ0Qm94OiBEeERhdGVCb3hDb21wb25lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVFbmRCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICAgIHByaXZhdGUgc2VsZWN0ZWREYXRlRW5kQm94OiBEeERhdGVCb3hDb21wb25lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnY2FsZW5kYXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBjYWxlbmRhcjpcclxuICAgICAgICB8IER4Q2FsZW5kYXJDb21wb25lbnRcclxuICAgICAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVSYW5nZUJ1dHRvbicsIHsgc3RhdGljOiB0cnVlfSlcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vIHB1YmxpYyBtZXRob2RzXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGNoYW5nZVJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRlUGlja2VyU2VydmljZTogU2RzRGF0ZVBpY2tlclNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlRGVmaW5pdGlvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5taW5EYXRlRGVmYXVsdCA9IG5ldyBEYXRlKDE5MDAsIDEsIDEpO1xyXG4gICAgICAgIHRoaXMubWF4RGF0ZURlZmF1bHQgPSBhZGQoc3RhcnRPZkRheShuZXcgRGF0ZSgpKSwgeyB5ZWFyczogNTAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgIGFwcGx5OiAnQXBwbHknLFxyXG4gICAgICAgICAgICBjdXN0b206ICdDdXN0b20nLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuY3VzdG9tRGF0ZVJhbmdlID0gbmV3IFBlcmlvZFBpY2tlckRhdGVSYW5nZShcclxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMuY3VzdG9tLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB0aGlzLmN1c3RvbURhdGVSYW5nZTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBzdGFydE9mTW9udGgobmV3IERhdGUoKSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzdGFydE9mRGF5KGVuZE9mTW9udGgobmV3IERhdGUoKSkpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZVJhbmdlVGV4dCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzWydkYXRlUmFuZ2VEZWZpbml0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGlvbktpbmQnXSl7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShkYXRlLCBkYXRlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dChkYXRlLCBkYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUxID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlMiA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKGRhdGUxLCBkYXRlMik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQoZGF0ZTEsIGRhdGUyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWyd0cmFuc2xhdGlvbnMnXSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUN1c3RvbVRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydsb2NhbGVzJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVMb2NhbGVzQ2hhbmdlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlU3RhcnQnXSB8fCBjaGFuZ2VzWydzZWxlY3RlZERhdGVFbmQnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVTdGFydE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQ7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlRW5kO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10uY3VycmVudFZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzdGFydE9mRGF5KHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWw7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlU3RhcnQnXSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10uY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlICYmIHRoaXMuc2hvd0RhdGVwaWNrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTYW1lRGF5KHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZUVuZCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FmdGVyKHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZUVuZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGVuZGFyPy5pbnN0YW5jZT8ucmVwYWludCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEeERlZmF1bHRDYWxlbmRhckZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dCh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlRW5kJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWRWYWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzU2FtZURheShzZWxlY3RlZFZhbHVlLCB0aGlzLmRhdGVTdGFydCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FmdGVyKHRoaXMuZGF0ZVN0YXJ0LCBzZWxlY3RlZFZhbHVlKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEeERlZmF1bHRDYWxlbmRhckZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dCh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydmaXJzdERheU9mV2VlayddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIHJhbmRvbUlkUmVmZXJlbmNlOiBudW1iZXIgPSBNYXRoLmZsb29yKFxyXG4gICAgICAgIE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxyXG4gICAgKTtcclxuXHJcbiAgICBwdWJsaWMgc2V0RGF0ZVJhbmdlRGVmaW5pdGlvbnMoZGVmaW5pdGlvbnM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZURlZmluaXRpb24+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VEZWZpbml0aW9ucyA9IGRlZmluaXRpb25zO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOiBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0aW9ucztcclxuICAgICAgICB0aGlzLnVwZGF0ZUN1c3RvbVRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0TG9jYWxlcyhsb2NhbGVzOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2NhbGVzID0gbG9jYWxlcztcclxuICAgICAgICB0aGlzLmhhbmRsZUxvY2FsZXNDaGFuZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkRGF0ZUVuZEZvY3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5zZWxlY3RlZERhdGVGb2N1cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzTWluaW11bUxpbWl0KCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5taW5EYXRlIGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWluRGF0ZSkgfHxcclxuICAgICAgICAgICAgICAgIGlzQmVmb3JlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWluRGF0ZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNNYXhpbXVtTGltaXQoKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm1heERhdGUgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5tYXhEYXRlKSB8fFxyXG4gICAgICAgICAgICAgICAgaXNBZnRlcih0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1heERhdGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25EYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWREYXRlRnJvbUV2ZW50ID0gbmV3IERhdGUoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGludGVyYWN0aXZlQ2hhbmdlID0gZXZlbnQuZXZlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW50ZXJhY3RpdmVDaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShzZWxlY3RlZERhdGVGcm9tRXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkRGF0ZUVuZEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKHNlbGVjdGVkRGF0ZUZyb21FdmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkRGF0ZUZyb21FdmVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShuZXdEYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IG5ld0RhdGU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ld0RhdGU7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pbml0Q2FsZW5kYXJWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNBZnRlcihuZXdEYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBhcyBEYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBuZXdEYXRlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlRW5kRGF0ZUNoYW5nZShuZXdEYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBuZXdEYXRlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXdEYXRlO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIC8vIHNlbGVjdGVkIGRhdGUgaXMgYmVmb3JlIHN0YXJ0IGRhdGUgLT4gc2V0IHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgaXNCZWZvcmUobmV3RGF0ZSwgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBhcyBEYXRlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IG5ld0RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3RhcnREYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShldmVudC52YWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkVuZERhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShldmVudC52YWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblJhbmdlS2V5UmVsZWFzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UpIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdEYXRlUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TdGFydERhdGVGb2N1cygpIHtcclxuICAgICAgICB0aGlzLmluaXRDYWxlbmRhclZhbHVlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q2FsZW5kYXJWYWx1ZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkVuZERhdGVGb2N1cygpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZUVuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlQZXJpb2RQaWNrZXIoKSB7XHJcbiAgICAgICAgdGhpcy5oaWRpbmdDb25maXJtZWREYXRlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2hvd2luZ0NhbGVuZGFyUG9wb3ZlcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlRGF0ZVBpY2tlckJveD8uaW5zdGFuY2UuZm9jdXMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0O1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFbmRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZUVuZDtcclxuICAgICAgICAgICAgdGhpcy5pc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Qm94Py5pbnN0YW5jZS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblN0YXJ0RGF0ZUZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlRGF0ZXBpY2tlclBvcHVwKGVtaXRDaGFuZ2UgPSB0cnVlKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuc2hvd0RhdGVwaWNrZXIpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldFNlbGVjdGVkRGF0ZSh0aGlzLmRhdGVTdGFydE9sZCwgdGhpcy5kYXRlRW5kT2xkLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZSh0aGlzLmRhdGVTdGFydE9sZCwgdGhpcy5kYXRlRW5kT2xkLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoe2ZvY3VzVmlzaWJsZTogZmFsc2V9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25IaWRkZW5DYWxlbmRhclBvcG92ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbG9zZURhdGVwaWNrZXJQb3B1cCgpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICBkYXRlU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUsXHJcbiAgICAgICAgZGF0ZUVuZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSxcclxuICAgICAgICBlbWl0Q2hhbmdlID0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IGRhdGVTdGFydDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCA9IGRhdGVFbmQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IGRhdGVTdGFydDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGVtaXRDaGFuZ2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RhcnROZXcgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVFbmROZXcgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGF0ZVN0YXJ0T2xkIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNTYW1lRGF5KHRoaXMuZGF0ZVN0YXJ0T2xkLCBkYXRlU3RhcnROZXcpKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRlU3RhcnRPbGQgPT09ICdzdHJpbmcnICYmIHRoaXMuZGF0ZVN0YXJ0T2xkID09PSAnJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGF0ZUVuZE9sZCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzU2FtZURheSh0aGlzLmRhdGVFbmRPbGQsIGRhdGVFbmROZXcpKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRlRW5kT2xkID09PSAnc3RyaW5nJyAmJiB0aGlzLmRhdGVFbmRPbGQgPT09ICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCB8fCBlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQ2hhbmdlLmVtaXQoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnb1RvTmV4dERhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5nZXROZXh0RGF0ZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUobmV3RGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoISh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSkgfHwgISh0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXROZXh0UmFuZ2VDYWxsYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ29Ub1ByZXZpb3VzRGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmdldFByZXZpb3VzRGF0ZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUobmV3RGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlKSB8fCAhKHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFByZXZpb3VzUmFuZ2VDYWxsYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc2V0TmV4dFByZXZpb3VzRGF5KHNldE5leHQ6IGFueSkge1xyXG4gICAgLy8gICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgLy8gICAgIGxldCBuZXdEYXRlID0gc2V0TmV4dFxyXG4gICAgLy8gICAgICAgICA/IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogMSB9KVxyXG4gICAgLy8gICAgICAgICA6IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XHJcblxyXG4gICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZShuZXdEYXRlKTtcclxuICAgIC8vICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShuZXdEYXRlLCBuZXdEYXRlKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dERheShjdXJyZW50RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IHN0cmluZyB8IG51bWJlciB8IERhdGUge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBhZGQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBhcyBEYXRlLCB7IGRheXM6IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByZXZpb3VzRGF5KGN1cnJlbnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0UmFuZ2UoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0ge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFJhbmdlKFxyXG4gICAgICAgICAgICBuZXcgRGF0ZShjdXJyZW50U3RhcnREYXRlKSxcclxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudEVuZERhdGUpLFxyXG4gICAgICAgICAgICAnbmV4dCdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmV2aW91c1JhbmdlKGN1cnJlbnRTdGFydERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGN1cnJlbnRFbmREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogW3N0cmluZyB8IG51bWJlciB8IERhdGUsIHN0cmluZyB8IG51bWJlciB8IERhdGVdIHtcclxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRSYW5nZShcclxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudFN0YXJ0RGF0ZSksXHJcbiAgICAgICAgICAgIG5ldyBEYXRlKGN1cnJlbnRFbmREYXRlKSxcclxuICAgICAgICAgICAgJ3ByZXZpb3VzJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE5leHRQcmV2aW91c1JhbmdlKHNldE5leHQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICEodGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUpIHx8XHJcbiAgICAgICAgICAgICEodGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0UmFuZ2UoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICBzZXROZXh0ID8gJ25leHQnIDogJ3ByZXZpb3VzJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbENzc0NsYXNzKGRhdGU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgICAgIGxldCBjc3MgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGVFbmRBc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBpc0FmdGVyKGNhbGVuZGFyRGF0ZSwgc3RhcnRPZkRheShzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSkpICYmXHJcbiAgICAgICAgICAgICAgICBpc0JlZm9yZShjYWxlbmRhckRhdGUsIHN0YXJ0T2ZEYXkoc2VsZWN0ZWREYXRlRW5kQXNEYXRlKSkgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBkYXkpKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNzcyArPSAnIGJnLXByaW1hcnktbGlnaHQgdGV4dC1kYXJrIHJvdW5kZWQtMCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYW1lRGF5KGNhbGVuZGFyRGF0ZSwgc2VsZWN0ZWREYXRlU3RhcnRBc0RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3NzICs9ICcgYmctcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtc3RhcnQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZURheShjYWxlbmRhckRhdGUsIHNlbGVjdGVkRGF0ZUVuZEFzRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjc3MgKz0gJyBiZy1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1lbmQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdEVuZERhdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gXCJwZXJpb2RcIiAmJiB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMgJiYgdGhpcy5jYWxlbmRhckNlbGxDbGlja2VkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpe1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93RGF0ZXBpY2tlcikge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNvZGUgPT09ICdFbnRlcicgfHwgZXZlbnQuY29kZSA9PT0gJ051bXBhZEVudGVyJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVBlcmlvZFBpY2tlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxlbmRhckNlbGxDbGlja2VkKGV2ZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIGN1cnJlbnQgRFggaW1wbGVtZW50YXRpb24gc28gaXRcclxuICAgICAgICAvLyBtdXN0IGJlIHJlLWNoZWNrZWQgYWZ0ZXIgZWFjaCBtYWpvciB1cGRhdGUgb2YgdGhlIERYIGNvbXBvbmVudHNcclxuICAgICAgICAvLyBBbHNvIGNoZWNrIGlmIGR4LWNhbGVuZGFyIHByb3ZpZGVzIGluZm8gYWJvdXQgY2xpY2tlZCBlbGVtZW50IGJ5XHJcbiAgICAgICAgLy8gZGVzaWduLlxyXG4gICAgICAgIGNvbnN0IHRhcmdldFBhcmVudENsYXNzTGlzdCA9IGV2ZW50LnRhcmdldD8ub2Zmc2V0UGFyZW50Py5jbGFzc0xpc3Q7XHJcbiAgICAgICAgaWYgKCF0YXJnZXRQYXJlbnRDbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc0NhbGVuZGFyQ2VsbCA9IFsuLi50YXJnZXRQYXJlbnRDbGFzc0xpc3RdLmluY2x1ZGVzKCdkeC1jYWxlbmRhci1jZWxsJyk7XHJcbiAgICAgICAgcmV0dXJuIGlzQ2FsZW5kYXJDZWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTG9jYWxlc0NoYW5nZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBhcHBseSBuZXcgbG9jYWxlIHRvIERYXHJcbiAgICAgICAgLy8gaWYgYXJyYXkgb2YgbG9jYWxlcyB3YXMgcHJvdmlkZWQgdXNlIGZpcnN0IG9uZVxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2NhbGVzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsb2NhbGUodGhpcy5sb2NhbGVzKTtcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sb2NhbGVzKSAmJiB0aGlzLmxvY2FsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsb2NhbGUodGhpcy5sb2NhbGVzWzBdKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRCb3g/Lmluc3RhbmNlLnJlcGFpbnQoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZEJveD8uaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgICAgIHRoaXMuc2luZ2xlRGF0ZVBpY2tlckJveD8uaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXI/Lmluc3RhbmNlLnJlcGFpbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUN1c3RvbVRleHQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRlUmFuZ2UubmFtZSA9IHRoaXMudHJhbnNsYXRpb25zPy5jdXN0b21cclxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9ucy5jdXN0b21cclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICcjZGF0ZXBpY2tlcmNvbXBvbmVudCAuZHgtY2FsZW5kYXItc2VsZWN0ZWQtZGF0ZSdcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbWVudCAmJlxyXG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdkeC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0Py5yZW1vdmUoJ2R4LWNhbGVuZGFyLXNlbGVjdGVkLWRhdGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKXtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UobmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCksIG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KSwgbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9XHJcbiAgICAgICAgICAgICF0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ0RhdGVSYW5nZShyYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gcmFuZ2U7XHJcblxyXG4gICAgICAgIGlmIChyYW5nZSA9PT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5vcGVuRGF0ZXBpY2tlclBvcHVwKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgID8gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gcmFuZ2UuZGF0ZVRvID8gcmFuZ2UuZGF0ZVRvIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnQsIHRoaXMuZGF0ZUVuZCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0RhdGVEaXNhYmxlZCA9IChhcmdzOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAgICAgICBpZiAodGhpcy5sb2NrQmVmb3JlRGF0ZSAmJiBpc0JlZm9yZShhcmdzLmRhdGUsIHRoaXMubG9ja0JlZm9yZURhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzLnNvbWUoKGRheSkgPT4gaXNTYW1lRGF5KGFyZ3MuZGF0ZSwgZGF5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXRjaERhdGVSYW5nZShkYXRlRnJvbT86IERhdGUsIGRhdGVUbz86IERhdGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRhdGVGcm9tIHx8ICFkYXRlVG8pIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRlUmFuZ2UgPSB0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzLmZpbHRlcihcclxuICAgICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoeC5kYXRlRnJvbSBhcyBEYXRlLCBkYXRlRnJvbSkgJiZcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh4LmRhdGVUbyBhcyBEYXRlLCBkYXRlVG8pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZGF0ZVJhbmdlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gZGF0ZVJhbmdlWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB0aGlzLmN1c3RvbURhdGVSYW5nZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXREYXRlUmFuZ2VUZXh0KGRhdGVGcm9tPzogRGF0ZSwgZGF0ZVRvPzogRGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcblxyXG4gICAgICAgIGlmICghKGRhdGVGcm9tIGluc3RhbmNlb2YgRGF0ZSkgfHwgIShkYXRlVG8gaW5zdGFuY2VvZiBEYXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSRVNPTFZFIFBFUklPRFxyXG4gICAgICAgIC8vIG9uZSBkYXlcclxuICAgICAgICBpZiAoaXNTYW1lRGF5KGRhdGVGcm9tLCBkYXRlVG8pKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zaW5nbGVEYXlGb3JtYXRGbiAhPT0gJ3VuZGVmaW5lZCcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuc2luZ2xlRGF5Rm9ybWF0Rm4oZGF0ZUZyb20pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlRnJvbSk7ICAvL3NraXAgZGF5IG5hbWUsIGFzIHdlIGhhdmUgY3VzdG9tIHRleHQuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZUZyb20sICdkYXktbG9uZycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRhdGUgcmFuZ2VcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGF0ZSByYW5nZSAtIHVzZSBwcm92aWRlZCBkYXRlUmFuZ2UgZm9ybWF0IGZ1bmN0aW9uIChpZiBkZWZpbmVkKVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0ZVJhbmdlRm9ybWF0Rm4gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5kYXRlUmFuZ2VGb3JtYXRGbihkYXRlRnJvbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gdGhpcy5kYXRlUmFuZ2VGb3JtYXRGbihkYXRlVG8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZ1bGwgbW9udGhcclxuICAgICAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZUZyb20sIHN0YXJ0T2ZNb250aChkYXRlRnJvbSkpICYmXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZVRvLCBlbmRPZk1vbnRoKGRhdGVUbykpICYmXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVNb250aChkYXRlRnJvbSwgZGF0ZVRvKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZyb20sXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vbnRoJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIC0gdXNlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgZnVuY3Rpb25cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5mb3JtYXREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZUZyb20sIHRvZGF5KSA/ICdkYXktc2hvcnQnIDogJ2RheSdcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gdGhpcy5mb3JtYXREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVUbyxcclxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVZZWFyKGRhdGVUbywgdG9kYXkpID8gJ2RheS1zaG9ydCcgOiAnZGF5J1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAhPSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdwcmVkZWZpbmVkUmFuZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9IHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UubmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VOYW1lID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lICsgJywgJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBASW5wdXQoKSBwdWJsaWMgc3R5bGU6ICdjbGFzc2ljJyB8ICdjb21wYWN0JyA9ICdjbGFzc2ljJztcclxuICAgICAgICAvLyBASW5wdXQoKSBwdWJsaWMgY29tcGFjdFN0eWxlRGlzcGxheTogJ2RhdGUnIHwgJ3ByZWRlZmluZWRSYW5nZScgfCAnYm90aCcgPSAncHJlZGVmaW5lZFJhbmdlJztcclxuICAgICAgICAvLyBpZiAodGhpcy5zdHlsZSA9PSAnY29tcGFjdCcgJiYgdGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdwcmVkZWZpbmVkUmFuZ2UnICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAhPSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lO1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLm5hbWU7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvcm1hdERhdGUoXHJcbiAgICAgICAgZGF0ZTogRGF0ZSxcclxuICAgICAgICB0eXBlPzogJ21vbnRoJyB8ICdkYXknIHwgJ2RheS1sb25nJyB8ICdkYXktc2hvcnQnIHwgdW5kZWZpbmVkXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FzZSAnZGF5LWxvbmcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYXNlICdkYXktc2hvcnQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZURhdGVSYW5nZXMoZm9yY2U/OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdG9kYXkgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGZvcmNlIHx8XHJcbiAgICAgICAgICAgICF0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSB8fFxyXG4gICAgICAgICAgICAhaXNTYW1lRGF5KHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlLCB0b2RheSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGUgPSB0b2RheTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXMgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRQcmVkZWZpbmVkRGF0ZVJhbmdlcyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVSYW5nZURlZmluaXRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5LFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REYXlPZldlZWtcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZXMgPSBbLi4udGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc107XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlcy5wdXNoKHRoaXMuY3VzdG9tRGF0ZVJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzXHJcbn1cclxuIiwiPCEtLSA8ZGl2IGlkPVwiZGF0ZXBpY2tlcmJ1dHRvbnNcIj4gLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJkYXRlcGlja2VyIGQtaW5saW5lLWZsZXggYmctd2hpdGUgc2RzLW5vLXByaW50XCJcclxuICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29tcG9uZW50QXJpYUxhYmVsXCJcclxuICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxyXG4gICAgPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGUgPT0gJ2NsYXNzaWMnXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicGlja2VyUHJlZGVmaW5lZFJhbmdlRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnRuIGJ0bi13aGl0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRlZC1zdGFydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHAtMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJkYXRlUmFuZ2VEZWZpbml0aW9uc1dpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcy0yIG1zLTEgbWUtMSBkYXRlLXJhbmdlLXRleHQgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZERhdGVSYW5nZS5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBkYXRlLXJhbmdlLWRyb3Bkb3duLWJ1dHRvbiBzZHMtZnctNDAwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJvcGVuRGF0ZVJhbmdlRGVmaW5pdGlvbnNBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImVsZW1lbnRVVUlEICsgJ19wcmVkZWZpbmVkX3BlcmlvZHNfZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPGR4LXBvcG92ZXJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJlbGVtZW50VVVJRCArICdfcHJlZGVmaW5lZF9wZXJpb2RzX2Ryb3Bkb3duJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiI3BpY2tlclByZWRlZmluZWRSYW5nZURyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICBbKHZpc2libGUpXT1cInNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbd3JhcHBlckF0dHJdPVwieyBjbGFzczogJ3Nkcy1kYXRlcGlja2VyLXJhbmdlcy1wb3BvdmVyIHNkcy1keC1wb3B1cC1uby1hcnJvdycgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21pbldpZHRoXT1cImRhdGVSYW5nZURlZmluaXRpb25zV2lkdGhcIlxyXG5cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCIgY2RrVHJhcEZvY3VzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByYW5nZSBvZiBkYXRlUmFuZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByZWRlZmluZWQtZGF0ZS1yYW5nZSBweC0zIHB5LTIgdy0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyYW5nZSA9PT0gc2VsZWN0ZWREYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ0RhdGVSYW5nZShyYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUmFuZ2VLZXlSZWxlYXNlZCgkZXZlbnQsIHJhbmdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JhbmdlLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9keC1wb3BvdmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXIgYm9yZGVyLWVuZC0wIHBlLTIgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5yb3VuZGVkLXN0YXJ0XSA9IFwic3R5bGUgPT0gJ2NvbXBhY3QnIHx8ICghZGF0ZVJhbmdlRGVmaW5pdGlvbnMgfHwgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc3RhcnQtMF0gPSBcInN0eWxlID09ICdjbGFzc2ljJyAmJiBkYXRlUmFuZ2VEZWZpbml0aW9ucy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicHJldmlvdXNQZXJpb2RBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNaW5pbXVtTGltaXQgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1ByZXZpb3VzRGF0ZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInByZXZpb3VzUGVyaW9kSWNvblwiPjwvZmEtaWNvbj5cclxuXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uXHJcbiAgICAgICAgICAgIGlkPVwicGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXItdG9wIGJvcmRlci1ib3R0b20gdGV4dC10cnVuY2F0ZSBweC0wIHNlbGVjdGVkLXBlcmlvZCBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgW2NsYXNzLnJvdW5kZWQtc3RhcnRdID0gXCIoIWRhdGVSYW5nZURlZmluaXRpb25zIHx8IGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA9PT0gMCkgJiYgIXNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcclxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zdGFydF0gPSBcIighZGF0ZVJhbmdlRGVmaW5pdGlvbnMgfHwgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKSAmJiAhc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbY2xhc3Mucm91bmRlZC1lbmRdID0gXCIhc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWVuZF0gPSBcIiFzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVwaWNrZXIgPSAhc2hvd0RhdGVwaWNrZXJcIlxyXG4gICAgICAgID5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwidXNlQ3VzdG9tRGlzcGxheUNvbnRlbnRcIiBzZWxlY3Q9XCJkaXNwbGF5XCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXVzZUN1c3RvbURpc3BsYXlDb250ZW50XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJteC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiY2FsZW5kYXJJY29uXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTEgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm14LTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ0b0ljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50Mn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgYm9yZGVyIHJvdW5kZWQtZW5kIGJvcmRlci1zdGFydC0wIHBzLTIgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5leHRQZXJpb2RBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNYXhpbXVtTGltaXQgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHREYXRlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwibmV4dFBlcmlvZEljb25cIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic2RzLXByaW50LW9ubHkgaC0xMDBcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJ1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiIHNlbGVjdD1cImRpc3BsYXlcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiF1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm14LTFcIj5cclxuICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImNhbGVuZGFySWNvblwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMSB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXgtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwidG9JY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJ9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjxkeC1wb3BvdmVyXHJcbiAgICB0YXJnZXQ9XCIjcGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICBwb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICBbKHZpc2libGUpXT1cInNob3dEYXRlcGlja2VyXCJcclxuICAgIChvbkhpZGluZyk9XCJvbkhpZGRlbkNhbGVuZGFyUG9wb3ZlcigpXCJcclxuICAgIChvblNob3dpbmcpPVwib25TaG93aW5nQ2FsZW5kYXJQb3BvdmVyKClcIlxyXG4gICAgY2xhc3M9XCJtLTAgcC0wXCJcclxuICAgIFt3cmFwcGVyQXR0cl09XCJ7XHJcbiAgICAgICAgY2xhc3M6ICdzZHMtZGF0ZXBpY2tlci1wb3BvdmVyICcgKyBkcm9wZG93bldyYXBwZXJDbGFzcyxcclxuICAgICAgICBpZDogZHJvcGRvd25XcmFwcGVySWRcclxuICAgIH1cIlxyXG4+XHJcbiAgICA8ZHhvLWFuaW1hdGlvbj5cclxuICAgICAgICA8ZHhvLXNob3dcclxuICAgICAgICAgICAgdHlwZT1cInBvcFwiXHJcbiAgICAgICAgICAgIFtmcm9tXT1cInsgc2NhbGU6IDAuOSB9XCJcclxuICAgICAgICAgICAgW3RvXT1cInsgc2NhbGU6IDEgfVwiXHJcbiAgICAgICAgPjwvZHhvLXNob3c+XHJcbiAgICAgICAgPGR4by1oaWRlXHJcbiAgICAgICAgICAgIHR5cGU9XCJmYWRlXCJcclxuICAgICAgICAgICAgW2Zyb21dPVwiMVwiXHJcbiAgICAgICAgICAgIFt0b109XCIwXCJcclxuICAgICAgICA+PC9keG8taGlkZT5cclxuICAgIDwvZHhvLWFuaW1hdGlvbj5cclxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIiAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiIHRhYmluZGV4PVwiMVwiPlxyXG4gICAgICAgIDxkeC1zY3JvbGwtdmlldz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0eWxlID09ICdjb21wYWN0JyAmJiBkYXRlUmFuZ2VzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHAtMyBiZy1ncmF5LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1icy1ncmF5LTIwMClcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMyBweS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5QcmVzZXRzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByYW5nZSBvZiBkYXRlUmFuZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJlZGVmaW5lZC1kYXRlLXJhbmdlIHB4LTMgcHktMiB3LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwicmFuZ2UgPT09IHNlbGVjdGVkRGF0ZVJhbmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ0RhdGVSYW5nZShyYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7cmFuZ2UubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJkYXRlcGlja2VyY29tcG9uZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZGF0ZS1pbnB1dHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgcHgtMyBwdC0zIHBiLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1kYXRlLWJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RlZERhdGVTdGFydEJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZCBkYXRlcGlja2VyLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwic2VsZWN0ZWREYXRlRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VNYXNrQmVoYXZpb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZGF0ZUlucHV0RGlzcGxheUZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWREYXRlU3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvblN0YXJ0RGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c0luKT1cIm9uU3RhcnREYXRlRm9jdXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWRhdGUtYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgcHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwidG9JY29uXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1kYXRlLWJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RlZERhdGVFbmRCb3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBwLTEgbS0wIHRleHQtY2VudGVyIHJvdW5kZWQgZGF0ZXBpY2tlci1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cIiFzZWxlY3RlZERhdGVGb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEcm9wRG93bkJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJkYXRlSW5wdXREaXNwbGF5Rm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1ZhbGlkXT1cImlzVmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZERhdGVFbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkVuZERhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNJbik9XCJvbkVuZERhdGVGb2N1cygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctd2hpdGUgbXgtMiBweC0yIHB5LTIgZGF0ZS1waWNrZXItZGF0ZS1zZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkYXRlLWlucHV0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgcC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1kYXRlLWJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2luZ2xlRGF0ZVBpY2tlckJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBwLTEgbS0wIHRleHQtY2VudGVyIHJvdW5kZWQgZGF0ZXBpY2tlci1pbnB1dCBkYXRlcGlja2VyLWlucHV0LWxhcmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEcm9wRG93bkJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VNYXNrQmVoYXZpb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImRhdGVJbnB1dERpc3BsYXlGb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4RGF0ZSB8fCBtYXhEYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1ZhbGlkXT1cImlzVmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInNlbGVjdGVkRGF0ZUludGVybmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIChvblZhbHVlQ2hhbmdlZCk9XCIgY2xvc2VEYXRlcGlja2VyUG9wdXAoKVwiIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEVuZERhdGUoJGV2ZW50KVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jYWxlbmRhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjYWxlbmRhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWREYXRlc109XCJpc0RhdGVEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmFsaWRdPVwiaXNWYWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25FcnJvcl09XCJ2YWxpZGF0aW9uRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJyA/IHNlbGVjdGVkRGF0ZUNhbGVuZGFyIDogc2VsZWN0ZWREYXRlSW50ZXJuYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkRhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpcnN0RGF5T2ZXZWVrXT1cImZpcnN0RGF5T2ZXZWVrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkeFRlbXBsYXRlPVwibGV0IGNlbGxEYXRhIG9mICdjZWxsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInaC0xMDAgcHQtMScgKyBnZXRDZWxsQ3NzQ2xhc3MoY2VsbERhdGEuZGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGluZS1oZWlnaHQucHhdPVwiMjNcIlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsb2NrQmVmb3JlRGF0ZSAmJiAoY2VsbERhdGEuZGF0ZSB8IHNkc0RhdGVDb21wYXJlOiBsb2NrQmVmb3JlRGF0ZSA6ICdsdGUnKTsgdGhlbiB0aGVuTG9ja0Jsb2NrIGVsc2UgZWxzZURlZmF1bHRCbG9ja1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RoZW5Mb2NrQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbdGl0bGVdPVwibG9ja0JlZm9yZURhdGVIaW50XCIgW2ljb25dPVwibG9ja0ljb25cIiAgY2xhc3M9XCJsb2NrZWQtZGF5IHBvc2l0aW9uLWFic29sdXRlLXhcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZURlZmF1bHRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNlbGxEYXRhLnRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgcHgtMyBwdC0yIHBiLTNcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVwaWNrZXIgPSBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25zLmNhbmNlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIChjbGljayk9XCJjbG9zZURhdGVwaWNrZXJQb3B1cCgpXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1zLTEgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UGVyaW9kUGlja2VyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zbGF0aW9ucy5hcHBseX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XHJcbiAgICA8L2Rpdj5cclxuPC9keC1wb3BvdmVyPlxyXG48IS0tIDwvZGl2PiAtLT5cclxuXHJcbiJdfQ==
843
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sRUFDUCxRQUFRLEVBQ1IsR0FBRyxHQUNOLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEUsT0FBTyxFQUNILHFCQUFxQixHQUd4QixNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7O0FBRzdCLDZEQUE2RDtBQVE3RCxNQUFNLE9BQU8sc0JBQXNCO0lBd0ovQixpQkFBaUI7SUFDakIsWUFDWSxTQUE0QixFQUM1QixpQkFBdUM7UUFEdkMsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQTFKMUIsbUJBQWMsR0FBUSxTQUFTLENBQUM7UUFFekQsbUJBQW1CO1FBQ1Ysa0JBQWEsR0FBd0IsUUFBUSxDQUFDO1FBRTlDLHlCQUFvQixHQUEyQyxFQUFFLENBQUM7UUFFM0UsdUJBQXVCO1FBQ2QsaUJBQVksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJL0MsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV2RCxtRUFBbUU7UUFDMUQsc0JBQWlCLEdBQTBDLFNBQVMsQ0FBQztRQUM5RSx1RUFBdUU7UUFDOUQsc0JBQWlCLEdBQTBDLFNBQVMsQ0FBQztRQUdwRSwwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU1uQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLG9CQUFlLEdBQVcsRUFBRSxDQUFDO1FBQzdCLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFFeEIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFFcEIsY0FBUyxHQUFZLE9BQU8sQ0FBQztRQUM3QixlQUFVLEdBQVksT0FBTyxDQUFDO1FBSTlCLG1CQUFjLEdBQThCLENBQUMsQ0FBQztRQUU5Qyw4QkFBeUIsR0FBVyxPQUFPLENBQUM7UUFDNUMsK0JBQTBCLEdBQVksSUFBSSxDQUFDO1FBRTNDLFVBQUssR0FBVyxPQUFPLENBQUM7UUFFeEIseUJBQW9CLEdBQVcsRUFBRSxDQUFDO1FBQ2xDLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUUvQiw0QkFBdUIsR0FBb0UsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvRyx3QkFBbUIsR0FBb0UsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUV2Ryw2QkFBd0IsR0FBMkksSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pMLHlCQUFvQixHQUEySSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRWpMLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUVoQyxtQ0FBOEIsR0FBRyxLQUFLLENBQUE7UUFFdEMsVUFBSyxHQUEwQixTQUFTLENBQUM7UUFDekMsd0JBQW1CLEdBQXdDLGlCQUFpQixDQUFDO1FBRTdFLDJCQUFzQixHQUFXLFdBQVcsQ0FBQztRQUU3RCxzQkFBc0I7UUFDdEI7OztXQUdHO1FBQ2EsdUJBQWtCLEdBQUcsYUFBYSxDQUFBO1FBRWxEOzs7V0FHRztRQUNhLHNDQUFpQyxHQUFHLGtDQUFrQyxDQUFBO1FBRXRGOzs7V0FHRztRQUNhLHdCQUFtQixHQUFHLGFBQWEsQ0FBQTtRQUVuRDs7O1dBR0c7UUFDYSw0QkFBdUIsR0FBRyxpQkFBaUIsQ0FBQTtRQVEzRCxvQkFBb0I7UUFDcEIsdUJBQWtCLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsWUFBWSxDQUFDO1FBQzlCLGlCQUFZLEdBQUcsVUFBVSxDQUFDO1FBQzFCLFdBQU0sR0FBRyxZQUFZLENBQUM7UUFDdEIsYUFBUSxHQUFHLE1BQU0sQ0FBQztRQUVsQix5QkFBb0IsR0FBaUMsRUFBRSxDQUFDO1FBQ3hELHNDQUFpQyxHQUFxQixTQUFTLENBQUM7UUFFaEUsZUFBVSxHQUFpQyxFQUFFLENBQUM7UUFFOUMsMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBQ25DLGtDQUE2QixHQUFXLEVBQUUsQ0FBQztRQUMzQyxrQ0FBNkIsR0FBVyxFQUFFLENBQUM7UUFLM0MseUJBQW9CLEdBQTJCLElBQUksSUFBSSxFQUFFLENBQUM7UUFDMUQseUJBQW9CLEdBQTJCLElBQUksSUFBSSxFQUFFLENBQUM7UUFFMUQsaUJBQVksR0FBMkIsRUFBRSxDQUFDO1FBQzFDLGNBQVMsR0FBMkIsRUFBRSxDQUFDO1FBQ3ZDLGVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBQ3hDLFlBQU8sR0FBMkIsRUFBRSxDQUFDO1FBR3JDLGtDQUE2QixHQUFZLEtBQUssQ0FBQztRQUUvQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFckMsaUNBQTRCLEdBQVksS0FBSyxDQUFDO1FBQzlDLCtCQUEwQixHQUFZLEtBQUssQ0FBQztRQUM1QyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFFeEIsZ0JBQVcsR0FBRyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBSWhELHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUdsQyx3QkFBbUIsR0FBbUMsU0FBUyxDQUFDO1FBRWhFLHlCQUFvQixHQUFtQyxTQUFTLENBQUM7UUFFakUsdUJBQWtCLEdBQW1DLFNBQVMsQ0FBQztRQUVyQixhQUFRLEdBRXhDLFNBQVMsQ0FBQztRQUdwQiw2QkFBd0IsR0FBMkIsU0FBUyxDQUFDO1FBMEs5RCxzQkFBaUIsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUMxQyxDQUFDO1FBMGVLLG1CQUFjLEdBQUcsQ0FBQyxJQUFTLEVBQVcsRUFBRTtZQUMzQyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNqRSxPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUE7UUFwcEJHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2hCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLFFBQVE7WUFDaEIsT0FBTyxFQUFFLFNBQVM7U0FDckIsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxxQkFBcUIsQ0FDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQ3hCLFNBQVMsRUFDVCxTQUFTLENBQ1osQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRTlDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUVwQyxDQUFDO0lBRUQsUUFBUSxLQUFJLENBQUM7SUFFYixXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBQztZQUV6QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO2dCQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFFakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDckM7aUJBQU07Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdkM7U0FFSjtRQUVELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQzNCO1FBRUQsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDOUI7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztTQUMxQztRQUVELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU3RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlDLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2dCQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztnQkFFekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDL0U7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUM5QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDeEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7Z0JBQ2hDLElBQUksSUFBSSxDQUFDLDRCQUE0QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQzFELElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO29CQUMvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO29CQUMxQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO2lCQUM3QztxQkFBTSxJQUNILENBQUMsSUFBSSxDQUFDLDBCQUEwQjtvQkFDaEMsSUFBSSxDQUFDLGNBQWMsRUFDckI7b0JBQ0UsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO3dCQUMvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO3dCQUMxQyxJQUNJLElBQUksQ0FBQyxPQUFPLFlBQVksSUFBSTs0QkFDNUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7Z0NBQ25DLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQzNDOzRCQUNFLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO3lCQUNoQztxQkFDSjtpQkFDSjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztpQkFDbEM7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2dCQUNwQyxJQUNJLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxJQUFJO29CQUN0QyxJQUFJLENBQUMsZUFBZSxZQUFZLElBQUksRUFDdEM7b0JBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNsRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztpQkFDdkU7YUFDSjtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDbEM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUN0RCxNQUFNLGFBQWEsR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakUsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtvQkFDbEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO3dCQUM3QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO3dCQUUxQyxJQUNJLElBQUksQ0FBQyxTQUFTLFlBQVksSUFBSTs0QkFDOUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0NBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQzdDOzRCQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO3lCQUNsQztxQkFDSjtpQkFDSjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztpQkFDN0M7Z0JBRUQsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQ3BDLElBQ0ksSUFBSSxDQUFDLGlCQUFpQixZQUFZLElBQUk7b0JBQ3RDLElBQUksQ0FBQyxlQUFlLFlBQVksSUFBSSxFQUN0QztvQkFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUN2RTthQUNKO1NBQ0o7UUFFRCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFPTSx1QkFBdUIsQ0FBQyxXQUFtRDtRQUM5RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sZUFBZSxDQUFDLFlBQXNDO1FBQ3pELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxVQUFVLENBQUMsT0FBK0I7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsc0JBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFXLG9CQUFvQjtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDckIsSUFDSSxJQUFJLENBQUMsT0FBTyxZQUFZLElBQUk7WUFDNUIsSUFBSSxDQUFDLG9CQUFvQixZQUFZLElBQUksRUFDM0M7WUFDRSxPQUFPLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEQsQ0FBQztTQUNMO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixJQUNJLElBQUksQ0FBQyxPQUFPLFlBQVksSUFBSTtZQUM1QixJQUFJLENBQUMsb0JBQW9CLFlBQVksSUFBSSxFQUMzQztZQUNFLE9BQU8sQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNuRCxDQUFDO1NBQ0w7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQVU7UUFDMUIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtZQUNoQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFFdEMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDbkIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2lCQUNyRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLENBQUM7aUJBQ25EO2dCQUVELElBQUksQ0FBQyxlQUFlLENBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsS0FBSyxDQUNSLENBQUM7YUFDTDtTQUNKO2FBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtZQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUcscUJBQXFCLENBQUM7U0FDckQ7SUFDTCxDQUFDO0lBRU0scUJBQXFCLENBQUMsT0FBYTtRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUM7UUFFcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBRS9CLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBdUIsQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQzthQUNsQztpQkFBTTtnQkFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQzlEO1NBQ0o7SUFDTCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsT0FBYTtRQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDO1FBRXBDO1FBQ0ksdURBQXVEO1FBQ3ZELFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUF5QixDQUFDLEVBQ25EO1lBQ0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRU0saUJBQWlCLENBQUMsS0FBVTtRQUMvQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxlQUFlLENBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsS0FBSyxDQUNSLENBQUM7SUFDTixDQUFDO0lBRU0sZUFBZSxDQUFDLEtBQVU7UUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsZUFBZSxDQUNoQixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQ3BCLEtBQUssQ0FDUixDQUFDO0lBQ04sQ0FBQztJQUVNLGtCQUFrQixDQUFDLEtBQW9CLEVBQUUsS0FBNEI7UUFDeEUsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVNLGdCQUFnQjtRQUNuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNoRTtRQUVELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGNBQWM7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzlEO0lBQ0wsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFTSx3QkFBd0I7UUFDM0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUVqQyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO1lBQ2hDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztZQUN6QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFFTCxDQUFDO0lBRU0sb0JBQW9CLENBQUMsVUFBVSxHQUFHLElBQUk7UUFDekMsNkJBQTZCO1FBQzdCLG1DQUFtQztRQUMvQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxlQUFlLENBQ2hCLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixVQUFVLENBQ2IsQ0FBQztTQUNMO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM1RTtpQkFDSTtnQkFDRCxrRUFBa0U7Z0JBQ2xFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ25FO1lBQ0Qsb0NBQW9DO1NBQ3ZDO1FBRUQsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUM7WUFDOUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztTQUM1RTtRQUNMLElBQUk7SUFDUixDQUFDO0lBRU0sdUJBQXVCO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO0lBQy9CLENBQUM7SUFFTSxlQUFlLENBQ2xCLFNBQWlDLEVBQ2pDLE9BQStCLEVBQy9CLFVBQVUsR0FBRyxJQUFJO1FBRWpCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7UUFFL0IsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztRQUV4QyxJQUFJLFVBQVUsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDM0Q7aUJBQU07Z0JBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFbEQsTUFBTSxnQkFBZ0IsR0FDbEIsQ0FBQyxJQUFJLENBQUMsWUFBWSxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNsRixDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxjQUFjLEdBQ2hCLENBQUMsSUFBSSxDQUFDLFVBQVUsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDNUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBRXBFLElBQUksZ0JBQWdCLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ3JELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQzdEO2dCQUVELElBQUksY0FBYyxFQUFFO29CQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDakQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQ3pEO2dCQUVELElBQUksZ0JBQWdCLElBQUksY0FBYyxFQUFFO29CQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLGlCQUFpQjt3QkFDdEIsSUFBSSxDQUFDLGVBQWU7cUJBQ3ZCLENBQUMsQ0FBQztpQkFDTjthQUNKO1lBRUQsSUFDSSxJQUFJLENBQUMsaUJBQWlCLFlBQVksSUFBSTtnQkFDdEMsSUFBSSxDQUFDLGVBQWUsWUFBWSxJQUFJLEVBQ3RDO2dCQUNFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDdkU7U0FFSjtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLFlBQVk7UUFDZixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FFMUM7YUFBTTtZQUNILElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsWUFBWSxJQUFJLENBQUMsRUFBRTtnQkFDdEYsT0FBTzthQUNWO1lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxlQUFlLENBQ3ZCLENBQUM7WUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFTSxnQkFBZ0I7UUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzFDO2FBQU07WUFDSCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLFlBQVksSUFBSSxDQUFDLEVBQUU7Z0JBQ3RGLE9BQU87YUFDVjtZQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FDdkMsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDO1lBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7SUFDTCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLDhDQUE4QztJQUM5Qyw0QkFBNEI7SUFDNUIsZ0VBQWdFO0lBQ2hFLGtFQUFrRTtJQUVsRSxxREFBcUQ7SUFDckQsOENBQThDO0lBQzlDLElBQUk7SUFFRyxVQUFVLENBQUMsV0FBbUM7UUFDakQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUN2QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQTRCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sY0FBYyxDQUFDLFdBQW1DO1FBQ3JELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUE0QixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBR00sWUFBWSxDQUFDLGdCQUF3QyxFQUFFLGNBQXNDO1FBQ2hHLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUNsQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMxQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsRUFDeEIsTUFBTSxDQUNULENBQUM7SUFDTixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsZ0JBQXdDLEVBQUUsY0FBc0M7UUFDcEcsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQ2xDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUN4QixVQUFVLENBQ2IsQ0FBQztJQUNOLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxPQUFnQjtRQUN4QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLElBQ0ksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxJQUFJLENBQUM7WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLFlBQVksSUFBSSxDQUFDLEVBQ3pDO1lBQ0UsT0FBTztTQUNWO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FDekMsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZUFBZSxFQUNwQixPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUNoQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLGVBQWUsQ0FBQyxJQUFTO1FBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUViLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7WUFDaEMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRSxNQUFNLHFCQUFxQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUU3RCxJQUNJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQzFELFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3pELENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFDakU7Z0JBQ0UsR0FBRyxJQUFJLHVDQUF1QyxDQUFDO2FBQ2xEO2lCQUFNO2dCQUNILElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxFQUFFO29CQUNsRCxHQUFHLElBQUksc0NBQXNDLENBQUM7aUJBQ2pEO2dCQUNELElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO29CQUNoRCxHQUFHLElBQUksb0NBQW9DLENBQUM7aUJBQy9DO2FBQ0o7U0FDSjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVNLGFBQWEsQ0FBQyxLQUFVO1FBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDOUQ7SUFDTCxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQW9CO1FBRWpDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsS0FBSyxDQUFDLHdCQUF3QixFQUFFLENBQUM7YUFDcEM7aUJBQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtnQkFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUM1QjtnQkFDRCxLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzthQUNwQztTQUNKO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQVU7UUFDbEMscUVBQXFFO1FBQ3JFLGtFQUFrRTtRQUNsRSxtRUFBbUU7UUFDbkUsVUFBVTtRQUNWLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN4QixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIseUJBQXlCO1FBQ3pCLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFBQSxDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU07WUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVPLDRCQUE0QjtRQUNoQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUNsQyxpREFBaUQsQ0FDcEQsQ0FBQztRQUNGLElBQ0ksT0FBTztZQUNQLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLDJCQUEyQixDQUFDLEVBQzNEO1lBQ0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUMzRDtJQUNMLENBQUM7SUFFTyx3QkFBd0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTTtZQUNILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1NBQzNGO0lBQ0wsQ0FBQztJQUVNLGlDQUFpQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLDZCQUE2QjtZQUM5QixDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztJQUM1QyxDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQTRCO1FBQzlDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUUvQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2hDLDhCQUE4QjtZQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM5QjthQUFNO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUTtnQkFDM0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRO2dCQUNoQixDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDO0lBU08sY0FBYyxDQUFDLFFBQWUsRUFBRSxNQUFhO1FBQ2pELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDOUMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNGLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxRQUFRLENBQUM7WUFDdkMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFjLEVBQUUsTUFBTSxDQUFDLENBQzFDLENBQUM7UUFDRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QzthQUFNO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7U0FDakQ7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsUUFBZSxFQUFFLE1BQWE7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxJQUFJLENBQUMsRUFBRTtZQUMxRCxPQUFPO1NBQ1Y7UUFFRCxpQkFBaUI7UUFDakIsVUFBVTtRQUNWLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM3QixJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFdBQVcsRUFBQztnQkFDOUMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN6RTtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUMzSSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLHdDQUF3QztpQkFDNUc7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUM5RTthQUNKO1NBQ0o7UUFDRCxhQUFhO2FBQ1I7WUFDRCxtRUFBbUU7WUFDbkUsSUFBSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxXQUFXLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdkU7WUFDRCxhQUFhO2lCQUNSLElBQ0QsU0FBUyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQyxXQUFXLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUMvQjtnQkFDRSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDaEQsUUFBUSxFQUNSLE9BQU8sQ0FDVixDQUFDO2FBQ0w7WUFDRCxnREFBZ0Q7aUJBQzNDO2dCQUNELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUNoRCxRQUFRLEVBQ1IsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ3BELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQ2hELE1BQU0sRUFDTixVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDbEQsQ0FBQzthQUNMO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNyRyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxpQkFBaUIsRUFBRTtnQkFDL0MsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxFQUFFLENBQUM7YUFDM0M7WUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzthQUNuRTtTQUNKO1FBQ0QsNERBQTREO1FBQzVELGdHQUFnRztRQUNoRyw4SkFBOEo7UUFDOUosd0VBQXdFO1FBQ3hFLCtDQUErQztRQUMvQyxjQUFjO1FBQ2QsSUFBSTtRQUNKLG1KQUFtSjtRQUNuSix3RUFBd0U7UUFDeEUsK0NBQStDO1FBQy9DLGNBQWM7UUFDZCxJQUFJO0lBQ1IsQ0FBQztJQUVPLFVBQVUsQ0FDZCxJQUFVLEVBQ1YsSUFBNkQ7UUFFN0QsUUFBUSxJQUFJLEVBQUU7WUFDVixLQUFLLE9BQU87Z0JBQ1IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDekMsS0FBSyxFQUFFLE1BQU07b0JBQ2IsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsR0FBRyxFQUFFLFNBQVM7aUJBQ2pCLENBQUMsQ0FBQztZQUNQLEtBQUssVUFBVTtnQkFDWCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsU0FBUztvQkFDaEIsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsT0FBTyxFQUFFLE1BQU07aUJBQ2xCLENBQUMsQ0FBQztZQUNQLEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsT0FBTztpQkFDakIsQ0FBQyxDQUFDO1lBQ1AsS0FBSyxLQUFLO2dCQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3pDLEdBQUcsRUFBRSxTQUFTO29CQUNkLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxTQUFTO2lCQUNsQixDQUFDLENBQUM7WUFDUDtnQkFDSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsU0FBUztvQkFDaEIsSUFBSSxFQUFFLFNBQVM7aUJBQ2xCLENBQUMsQ0FBQztTQUNWO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQWU7UUFDdEMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVyQyxJQUNJLEtBQUs7WUFDTCxDQUFDLElBQUksQ0FBQyxpQ0FBaUM7WUFDdkMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxFQUMzRDtZQUNFLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxLQUFLLENBQUM7WUFFL0MsSUFBSSxDQUFDLG9CQUFvQjtnQkFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUMxQyxJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLEtBQUssRUFDTCxJQUFJLENBQUMsY0FBYyxDQUN0QixDQUFDO1lBRU4sSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQzs7b0hBaDlCUSxzQkFBc0I7d0dBQXRCLHNCQUFzQiwyMkVDdkRuQywwNWhCQXlWQTs0RkRsU2Esc0JBQXNCO2tCQU5sQyxTQUFTOytCQUNJLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNOzJJQUd0QixjQUFjO3NCQUF0QyxZQUFZO3VCQUFDLFNBQVM7Z0JBR2QsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDVyxrQkFBa0I7c0JBQWxDLE1BQU07Z0JBR0UsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNJLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFHRSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0kscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUUsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxZQUFZO3NCQUEzQixLQUFLO2dCQUVVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBRVUseUJBQXlCO3NCQUF4QyxLQUFLO2dCQUNVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFFVSxLQUFLO3NCQUFwQixLQUFLO2dCQUVVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBRVUsdUJBQXVCO3NCQUF0QyxLQUFLO2dCQUNVLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFFVSx3QkFBd0I7c0JBQXZDLEtBQUs7Z0JBQ1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUVVLHVCQUF1QjtzQkFBdEMsS0FBSztnQkFFVSw4QkFBOEI7c0JBQTdDLEtBQUs7Z0JBRVUsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBRVUsc0JBQXNCO3NCQUFyQyxLQUFLO2dCQU9VLGtCQUFrQjtzQkFBakMsS0FBSztnQkFNVSxpQ0FBaUM7c0JBQWhELEtBQUs7Z0JBTVUsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQU1VLHVCQUF1QjtzQkFBdEMsS0FBSztnQkFJVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkE4Q0UsbUJBQW1CO3NCQUQxQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHM0Msb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHNUMsa0JBQWtCO3NCQUR6QixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHQSxRQUFRO3NCQUF6RCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBS2hDLHdCQUF3QjtzQkFEL0IsU0FBUzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDb250ZW50Q2hpbGQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEeENhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL2NhbGVuZGFyJztcclxuaW1wb3J0IHsgRHhEYXRlQm94Q29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL2RhdGUtYm94JztcclxuaW1wb3J0IHsgbG9jYWxlIH0gZnJvbSBcImRldmV4dHJlbWUvbG9jYWxpemF0aW9uXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgaXNTYW1lRGF5LFxyXG4gICAgaXNTYW1lWWVhcixcclxuICAgIGlzU2FtZU1vbnRoLFxyXG4gICAgc3RhcnRPZkRheSxcclxuICAgIHN0YXJ0T2ZNb250aCxcclxuICAgIGVuZE9mTW9udGgsXHJcbiAgICBpc0FmdGVyLFxyXG4gICAgaXNCZWZvcmUsXHJcbiAgICBhZGQsXHJcbn0gZnJvbSAnZGF0ZS1mbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGZhQW5nbGVMZWZ0LFxyXG4gICAgZmFBbmdsZVJpZ2h0LFxyXG4gICAgZmFDYWxlbmRhcixcclxuICAgIGZhTG9ja1xyXG59IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tcmVndWxhci1zdmctaWNvbnMnO1xyXG5cclxuaW1wb3J0IHsgZmFBcnJvd1JpZ2h0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL3Byby1saWdodC1zdmctaWNvbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIFBlcmlvZFBpY2tlckRhdGVSYW5nZSxcclxuICAgIFBlcmlvZFBpY2tlckRhdGVSYW5nZURlZmluaXRpb24sXHJcbiAgICBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnMsXHJcbn0gZnJvbSAnLi9kYXRlLXBpY2tlci5tb2RlbCc7XHJcbmltcG9ydCB7IFNkc0RhdGVQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZHMtZGF0ZS1waWNrZXIuc2VydmljZSc7XHJcblxyXG4vLyBpbXBvcnQgeyBmYUxvY2sgfSBmcm9tICdAZm9ydGF3ZXNvbWUvcHJvLXNvbGlkLXN2Zy1pY29ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc2RzLWRhdGUtcGlja2VyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZHNEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gICAgQENvbnRlbnRDaGlsZCgnZGlzcGxheScpIGRpc3BsYXlDb250ZW50OiBhbnkgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gcHVibGljIGludGVyZmFjZVxyXG4gICAgQElucHV0KCkgc2VsZWN0aW9uS2luZDogJ3BlcmlvZCcgfCAnc2luZ2xlJyA9ICdwZXJpb2QnO1xyXG5cclxuICAgIEBJbnB1dCgpIGRhdGVSYW5nZURlZmluaXRpb25zOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uPiA9IFtdO1xyXG5cclxuICAgIC8vIHNpbmdsZSBkYXRlIHNlbGVjdG9yXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgLy8gcGVyaW9kIHNlbGVjdG9yXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGVTdGFydDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZERhdGVTdGFydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICAvLyBmb3JtYXQgZnVuY3Rpb24gZm9yIGRpc3BsYXlpbmcgZGF0ZSB3aGVuIHNpbmdsZSBkYXRlIGlzIHNlbGVjdGVkXHJcbiAgICBASW5wdXQoKSBzaW5nbGVEYXlGb3JtYXRGbjogKChkYXRlOiBEYXRlKSA9PiBzdHJpbmcgKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIC8vIGZvcm1hdCBmdW5jdGlvbiBmb3IgZGlzcGxheWluZyBlYWNoIGRhdGUgd2hlbiBkYXRlIHJhbmdlIGlzIHNlbGVjdGVkXHJcbiAgICBASW5wdXQoKSBkYXRlUmFuZ2VGb3JtYXRGbjogKChkYXRlOiBEYXRlKSA9PiBzdHJpbmcgKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGVFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGU7XHJcbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWREYXRlRW5kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHBlcmlvZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBASW5wdXQoKSBtaW5EYXRlPzogRGF0ZTtcclxuICAgIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xyXG5cclxuICAgIEBJbnB1dCgpIGxvY2FsZXM/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+O1xyXG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHZhbGlkYXRpb25FcnJvcjogc3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYXBwbHlUZXh0Pzogc3RyaW5nID0gJ2Nsb3NlJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjYW5jZWxUZXh0Pzogc3RyaW5nID0gJ2Nsb3NlJztcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdHJhbnNsYXRpb25zOiBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnM7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGZpcnN0RGF5T2ZXZWVrOiAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2ID0gMTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0ZVJhbmdlRGVmaW5pdGlvbnNXaWR0aDogc3RyaW5nID0gJzExcmVtJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHdpZHRoOiBzdHJpbmcgPSAnMzByZW0nO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93bldyYXBwZXJDbGFzczogc3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25XcmFwcGVySWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXRQcmV2aW91c0RhdGVDYWxsYmFjazogKGN1cnJlbnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gdGhpcy5nZXRQcmV2aW91c0RheTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXROZXh0RGF0ZUNhbGxiYWNrOiAoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSB0aGlzLmdldE5leHREYXk7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGdldFByZXZpb3VzUmFuZ2VDYWxsYmFjazogKGN1cnJlbnRTdGFydERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGN1cnJlbnRFbmREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA9PiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0gPSB0aGlzLmdldFByZXZpb3VzUmFuZ2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0TmV4dFJhbmdlQ2FsbGJhY2s6IChjdXJyZW50U3RhcnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBjdXJyZW50RW5kRGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkgPT4gW3N0cmluZyB8IG51bWJlciB8IERhdGUsIHN0cmluZyB8IG51bWJlciB8IERhdGVdID0gdGhpcy5nZXROZXh0UmFuZ2U7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHVzZUN1c3RvbURpc3BsYXlDb250ZW50ID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGRpc3BsYXlQcmVkZWZpbmVkRGF0ZVJhbmdlTmFtZSA9IGZhbHNlXHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHN0eWxlOiAnY2xhc3NpYycgfCAnY29tcGFjdCcgPSAnY2xhc3NpYyc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY29tcGFjdFN0eWxlRGlzcGxheTogJ2RhdGUnIHwgJ3ByZWRlZmluZWRSYW5nZScgfCAnYm90aCcgPSAncHJlZGVmaW5lZFJhbmdlJztcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0ZUlucHV0RGlzcGxheUZvcm1hdDogc3RyaW5nID0gJ3Nob3J0RGF0ZSc7XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBBcmlhIGlucHV0c1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIENvbXBvbmVudCBhcmlhLWxhYmVsLiBEZWZhdWx0cyB0byAnRGF0ZSBwaWNrZXInXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnRBcmlhTGFiZWwgPSAnRGF0ZSBwaWNrZXInXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIFByZWRlZmluZWQgZGF0ZSByYW5nZSBkZWZpbml0aW9ucyBkcm9wZG93biBidXR0b24gYXJpYS1sYWJlbC4gRGVmYXVsdHMgdG8gJ09wZW4gcHJlZGVmaW5lZCBkYXRlIHJhbmdlcyBwYW5lJ1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgb3BlbkRhdGVSYW5nZURlZmluaXRpb25zQXJpYUxhYmVsID0gJ09wZW4gcHJlZGVmaW5lZCBkYXRlIHJhbmdlcyBwYW5lJ1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBOZXh0IHBlcmlvZCBidXR0b24gYXJpYS1sYWJlbC4gRGVmYXVsdCB0byAnTmV4dCBwZXJpb2QnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBuZXh0UGVyaW9kQXJpYUxhYmVsID0gJ05leHQgcGVyaW9kJ1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBQcmV2aW91cyBwZXJpb2QgYnV0dG9uIGFyaWEtbGFiZWwuIERlZmF1bHRzIHRvICdQcmV2aW91cyBwZXJpb2QnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmV2aW91c1BlcmlvZEFyaWFMYWJlbCA9ICdQcmV2aW91cyBwZXJpb2QnXHJcblxyXG4gICAgLy8gI2VuZHJlZ2lvbiBBUklBIGlucHV0c1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2NrQmVmb3JlRGF0ZT86IERhdGU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9ja0JlZm9yZURhdGVIaW50Pzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvLyBwdWJsaWMgcHJvcGVydGllc1xyXG4gICAgcHJldmlvdXNQZXJpb2RJY29uID0gZmFBbmdsZUxlZnQ7XHJcbiAgICBuZXh0UGVyaW9kSWNvbiA9IGZhQW5nbGVSaWdodDtcclxuICAgIGNhbGVuZGFySWNvbiA9IGZhQ2FsZW5kYXI7XHJcbiAgICB0b0ljb24gPSBmYUFycm93UmlnaHQ7XHJcbiAgICBsb2NrSWNvbiA9IGZhTG9jaztcclxuXHJcbiAgICBwcmVkZWZpbmVkRGF0ZVJhbmdlczogQXJyYXk8UGVyaW9kUGlja2VyRGF0ZVJhbmdlPiA9IFtdO1xyXG4gICAgcHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2U6IFBlcmlvZFBpY2tlckRhdGVSYW5nZTtcclxuICAgIGRhdGVSYW5nZXM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZT4gPSBbXTtcclxuXHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZU5hbWU6IHN0cmluZyA9ICcnO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDE6IHN0cmluZyA9ICcnO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIG1pbkRhdGVEZWZhdWx0OiBEYXRlO1xyXG4gICAgbWF4RGF0ZURlZmF1bHQ6IERhdGU7XHJcblxyXG4gICAgc2VsZWN0ZWREYXRlQ2FsZW5kYXI6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgc2VsZWN0ZWREYXRlSW50ZXJuYWw6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGRhdGVTdGFydE9sZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9ICcnO1xyXG4gICAgZGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kT2xkOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcblxyXG4gICAgc2hvd0RhdGVwaWNrZXI6IGJvb2xlYW47XHJcbiAgICBzaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGhpZGluZ0NvbmZpcm1lZERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc2VsZWN0ZWREYXRlRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHByb3RlY3RlZCBlbGVtZW50VVVJRCA9ICdzZHMtYXMtJyArIGNyeXB0by5yYW5kb21VVUlEKCk7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBmaWVsZHNcclxuICAgIHByaXZhdGUgY3VzdG9tRGF0ZVJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2U7XHJcbiAgICBwcml2YXRlIGluaXRDYWxlbmRhclZhbHVlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzaW5nbGVEYXRlUGlja2VyQm94JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgICBwcml2YXRlIHNpbmdsZURhdGVQaWNrZXJCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkRGF0ZVN0YXJ0Qm94JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgICBwcml2YXRlIHNlbGVjdGVkRGF0ZVN0YXJ0Qm94OiBEeERhdGVCb3hDb21wb25lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVFbmRCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICAgIHByaXZhdGUgc2VsZWN0ZWREYXRlRW5kQm94OiBEeERhdGVCb3hDb21wb25lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnY2FsZW5kYXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBjYWxlbmRhcjpcclxuICAgICAgICB8IER4Q2FsZW5kYXJDb21wb25lbnRcclxuICAgICAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVSYW5nZUJ1dHRvbicsIHsgc3RhdGljOiB0cnVlfSlcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vIHB1YmxpYyBtZXRob2RzXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGNoYW5nZVJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRlUGlja2VyU2VydmljZTogU2RzRGF0ZVBpY2tlclNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlRGVmaW5pdGlvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5taW5EYXRlRGVmYXVsdCA9IG5ldyBEYXRlKDE5MDAsIDEsIDEpO1xyXG4gICAgICAgIHRoaXMubWF4RGF0ZURlZmF1bHQgPSBhZGQoc3RhcnRPZkRheShuZXcgRGF0ZSgpKSwgeyB5ZWFyczogNTAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgIGFwcGx5OiAnQXBwbHknLFxyXG4gICAgICAgICAgICBjdXN0b206ICdDdXN0b20nLFxyXG4gICAgICAgICAgICBwcmVzZXRzOiAnUHJlc2V0cycsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRlUmFuZ2UgPSBuZXcgUGVyaW9kUGlja2VyRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucy5jdXN0b20sXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdW5kZWZpbmVkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IHN0YXJ0T2ZNb250aChuZXcgRGF0ZSgpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCA9IHN0YXJ0T2ZEYXkoZW5kT2ZNb250aChuZXcgRGF0ZSgpKSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlUmFuZ2VUZXh0KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge31cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2RhdGVSYW5nZURlZmluaXRpb25zJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZURhdGVSYW5nZXModHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0aW9uS2luZCddKXtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKGRhdGUsIGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KGRhdGUsIGRhdGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZTEgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUyID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UoZGF0ZTEsIGRhdGUyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dChkYXRlMSwgZGF0ZTIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3RyYW5zbGF0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VzdG9tVGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2xvY2FsZXMnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUxvY2FsZXNDaGFuZ2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGVTdGFydCddIHx8IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkID0gdGhpcy5zZWxlY3RlZERhdGVTdGFydDtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kT2xkID0gdGhpcy5zZWxlY3RlZERhdGVFbmQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10pIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShjaGFuZ2VzWydzZWxlY3RlZERhdGUnXS5jdXJyZW50VmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHN0YXJ0T2ZEYXkodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGVTdGFydCddKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlU3RhcnQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgJiYgdGhpcy5zaG93RGF0ZXBpY2tlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVTdGFydEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1NhbWVEYXkoc2VsZWN0ZWRWYWx1ZSwgdGhpcy5kYXRlRW5kKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIoc2VsZWN0ZWRWYWx1ZSwgdGhpcy5kYXRlRW5kKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsZW5kYXI/Lmluc3RhbmNlPy5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlRW5kJ10pIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZERhdGVFbmQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZUVuZEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTYW1lRGF5KHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZVN0YXJ0KSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIodGhpcy5kYXRlU3RhcnQsIHNlbGVjdGVkVmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2ZpcnN0RGF5T2ZXZWVrJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZURhdGVSYW5nZXModHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgcmFuZG9tSWRSZWZlcmVuY2U6IG51bWJlciA9IE1hdGguZmxvb3IoXHJcbiAgICAgICAgTWF0aC5yYW5kb20oKSAqIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXHJcbiAgICApO1xyXG5cclxuICAgIHB1YmxpYyBzZXREYXRlUmFuZ2VEZWZpbml0aW9ucyhkZWZpbml0aW9uczogQXJyYXk8UGVyaW9kUGlja2VyRGF0ZVJhbmdlRGVmaW5pdGlvbj4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRhdGVSYW5nZURlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZURhdGVSYW5nZXModHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnM6IFBlcmlvZFBpY2tlclRyYW5zbGF0aW9ucyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ3VzdG9tVGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRMb2NhbGVzKGxvY2FsZXM6IHN0cmluZyB8IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvY2FsZXMgPSBsb2NhbGVzO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlTG9jYWxlc0NoYW5nZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWREYXRlU3RhcnRGb2N1cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVGb2N1cztcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWREYXRlRW5kRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNNaW5pbXVtTGltaXQoKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm1pbkRhdGUgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5taW5EYXRlKSB8fFxyXG4gICAgICAgICAgICAgICAgaXNCZWZvcmUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5taW5EYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc01heGltdW1MaW1pdCgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMubWF4RGF0ZSBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1heERhdGUpIHx8XHJcbiAgICAgICAgICAgICAgICBpc0FmdGVyKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWF4RGF0ZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZERhdGVGcm9tRXZlbnQgPSBuZXcgRGF0ZShldmVudC52YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVDaGFuZ2UgPSBldmVudC5ldmVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbnRlcmFjdGl2ZUNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKHNlbGVjdGVkRGF0ZUZyb21FdmVudCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVuZERhdGVDaGFuZ2Uoc2VsZWN0ZWREYXRlRnJvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWREYXRlRnJvbUV2ZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlU3RhcnREYXRlQ2hhbmdlKG5ld0RhdGU6IERhdGUpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0ID0gbmV3RGF0ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3RGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRDYWxlbmRhclZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0FmdGVyKG5ld0RhdGUsIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGFzIERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCA9IG5ld0RhdGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVFbmREYXRlQ2hhbmdlKG5ld0RhdGU6IERhdGUpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCA9IG5ld0RhdGU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ld0RhdGU7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgLy8gc2VsZWN0ZWQgZGF0ZSBpcyBiZWZvcmUgc3RhcnQgZGF0ZSAtPiBzZXQgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICBpc0JlZm9yZShuZXdEYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGFzIERhdGUpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0ID0gbmV3RGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TdGFydERhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKGV2ZW50LnZhbHVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRW5kRGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKGV2ZW50LnZhbHVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uUmFuZ2VLZXlSZWxlYXNlZChldmVudDogS2V5Ym9hcmRFdmVudCwgcmFuZ2U6IFBlcmlvZFBpY2tlckRhdGVSYW5nZSkge1xyXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ0RhdGVSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN0YXJ0RGF0ZUZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdENhbGVuZGFyVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVTdGFydCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDYWxlbmRhclZhbHVlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRW5kRGF0ZUZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseVBlcmlvZFBpY2tlcigpIHtcclxuICAgICAgICB0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TaG93aW5nQ2FsZW5kYXJQb3BvdmVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaGlkaW5nQ29uZmlybWVkRGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVEYXRlUGlja2VyQm94Py5pbnN0YW5jZS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVTdGFydE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQ7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlRW5kO1xyXG4gICAgICAgICAgICB0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRCb3g/Lmluc3RhbmNlLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU3RhcnREYXRlRm9jdXMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2VEYXRlcGlja2VyUG9wdXAoZW1pdENoYW5nZSA9IHRydWUpIHtcclxuICAgICAgICAvLyBpZiAodGhpcy5zaG93RGF0ZXBpY2tlcikge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNob3dEYXRlcGlja2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlkaW5nQ29uZmlybWVkRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHRoaXMuZGF0ZVN0YXJ0T2xkLCB0aGlzLmRhdGVFbmRPbGQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHRoaXMuZGF0ZVN0YXJ0T2xkLCB0aGlzLmRhdGVFbmRPbGQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuaGlkaW5nQ29uZmlybWVkRGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b24pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cyh7Zm9jdXNWaXNpYmxlOiBmYWxzZX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkhpZGRlbkNhbGVuZGFyUG9wb3ZlcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsb3NlRGF0ZXBpY2tlclBvcHVwKClcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0U2VsZWN0ZWREYXRlKFxyXG4gICAgICAgIGRhdGVTdGFydDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSxcclxuICAgICAgICBkYXRlRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLFxyXG4gICAgICAgIGVtaXRDaGFuZ2UgPSB0cnVlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0ID0gZGF0ZVN0YXJ0O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gZGF0ZUVuZDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gZGF0ZVN0YXJ0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZW1pdENoYW5nZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdGFydE5ldyA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUVuZE5ldyA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGVDaGFuZ2VkID1cclxuICAgICAgICAgICAgICAgICAgICAodGhpcy5kYXRlU3RhcnRPbGQgaW5zdGFuY2VvZiBEYXRlICYmICFpc1NhbWVEYXkodGhpcy5kYXRlU3RhcnRPbGQsIGRhdGVTdGFydE5ldykpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGVTdGFydE9sZCA9PT0gJ3N0cmluZycgJiYgdGhpcy5kYXRlU3RhcnRPbGQgPT09ICcnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGVDaGFuZ2VkID1cclxuICAgICAgICAgICAgICAgICAgICAodGhpcy5kYXRlRW5kT2xkIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNTYW1lRGF5KHRoaXMuZGF0ZUVuZE9sZCwgZGF0ZUVuZE5ldykpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGVFbmRPbGQgPT09ICdzdHJpbmcnICYmIHRoaXMuZGF0ZUVuZE9sZCA9PT0gJycpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Q2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVuZERhdGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kT2xkID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGVDaGFuZ2VkIHx8IGVuZERhdGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJpb2RDaGFuZ2UuZW1pdChbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoYW5nZVJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdvVG9OZXh0RGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmdldE5leHREYXRlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZShuZXdEYXRlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUobmV3RGF0ZSwgbmV3RGF0ZSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlKSB8fCAhKHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldE5leHRSYW5nZUNhbGxiYWNrKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnb1RvUHJldmlvdXNEYXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuZ2V0UHJldmlvdXNEYXRlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZShuZXdEYXRlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUobmV3RGF0ZSwgbmV3RGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCEodGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUpIHx8ICEodGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UHJldmlvdXNSYW5nZUNhbGxiYWNrKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzZXROZXh0UHJldmlvdXNEYXkoc2V0TmV4dDogYW55KSB7XHJcbiAgICAvLyAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAvLyAgICAgbGV0IG5ld0RhdGUgPSBzZXROZXh0XHJcbiAgICAvLyAgICAgICAgID8gYWRkKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgYXMgRGF0ZSwgeyBkYXlzOiAxIH0pXHJcbiAgICAvLyAgICAgICAgIDogYWRkKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgYXMgRGF0ZSwgeyBkYXlzOiAtMSB9KTtcclxuXHJcbiAgICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IG5ldyBEYXRlKG5ld0RhdGUpO1xyXG4gICAgLy8gICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0RGF5KGN1cnJlbnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogMSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJldmlvdXNEYXkoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlIHtcclxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gYWRkKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgYXMgRGF0ZSwgeyBkYXlzOiAtMSB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldE5leHRSYW5nZShjdXJyZW50U3RhcnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBjdXJyZW50RW5kRGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IFtzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBzdHJpbmcgfCBudW1iZXIgfCBEYXRlXSB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0UmFuZ2UoXHJcbiAgICAgICAgICAgIG5ldyBEYXRlKGN1cnJlbnRTdGFydERhdGUpLFxyXG4gICAgICAgICAgICBuZXcgRGF0ZShjdXJyZW50RW5kRGF0ZSksXHJcbiAgICAgICAgICAgICduZXh0J1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByZXZpb3VzUmFuZ2UoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0ge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFJhbmdlKFxyXG4gICAgICAgICAgICBuZXcgRGF0ZShjdXJyZW50U3RhcnREYXRlKSxcclxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudEVuZERhdGUpLFxyXG4gICAgICAgICAgICAncHJldmlvdXMnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0TmV4dFByZXZpb3VzUmFuZ2Uoc2V0TmV4dDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgISh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSkgfHxcclxuICAgICAgICAgICAgISh0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRSYW5nZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIHNldE5leHQgPyAnbmV4dCcgOiAncHJldmlvdXMnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDZWxsQ3NzQ2xhc3MoZGF0ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXRlID0gbmV3IERhdGUoZGF0ZSk7XHJcbiAgICAgICAgbGV0IGNzcyA9ICcnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZVN0YXJ0QXNEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZUVuZEFzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGlzQWZ0ZXIoY2FsZW5kYXJEYXRlLCBzdGFydE9mRGF5KHNlbGVjdGVkRGF0ZVN0YXJ0QXNEYXRlKSkgJiZcclxuICAgICAgICAgICAgICAgIGlzQmVmb3JlKGNhbGVuZGFyRGF0ZSwgc3RhcnRPZkRheShzZWxlY3RlZERhdGVFbmRBc0RhdGUpKSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuZGlzYWJsZWREYXRlcy5zb21lKChkYXkpID0+IGlzU2FtZURheShjYWxlbmRhckRhdGUsIGRheSkpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY3NzICs9ICcgYmctcHJpbWFyeS1saWdodCB0ZXh0LWRhcmsgcm91bmRlZC0wJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjc3MgKz0gJyBiZy1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1zdGFydCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYW1lRGF5KGNhbGVuZGFyRGF0ZSwgc2VsZWN0ZWREYXRlRW5kQXNEYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNzcyArPSAnIGJnLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLWVuZCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0RW5kRGF0ZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSBcInBlcmlvZFwiICYmIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRGb2N1cyAmJiB0aGlzLmNhbGVuZGFyQ2VsbENsaWNrZWQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCl7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dEYXRlcGlja2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5jb2RlID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJyB8fCBldmVudC5jb2RlID09PSAnTnVtcGFkRW50ZXInKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5UGVyaW9kUGlja2VyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGVuZGFyQ2VsbENsaWNrZWQoZXZlbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggY3VycmVudCBEWCBpbXBsZW1lbnRhdGlvbiBzbyBpdFxyXG4gICAgICAgIC8vIG11c3QgYmUgcmUtY2hlY2tlZCBhZnRlciBlYWNoIG1ham9yIHVwZGF0ZSBvZiB0aGUgRFggY29tcG9uZW50c1xyXG4gICAgICAgIC8vIEFsc28gY2hlY2sgaWYgZHgtY2FsZW5kYXIgcHJvdmlkZXMgaW5mbyBhYm91dCBjbGlja2VkIGVsZW1lbnQgYnlcclxuICAgICAgICAvLyBkZXNpZ24uXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFyZW50Q2xhc3NMaXN0ID0gZXZlbnQudGFyZ2V0Py5vZmZzZXRQYXJlbnQ/LmNsYXNzTGlzdDtcclxuICAgICAgICBpZiAoIXRhcmdldFBhcmVudENsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlzQ2FsZW5kYXJDZWxsID0gWy4uLnRhcmdldFBhcmVudENsYXNzTGlzdF0uaW5jbHVkZXMoJ2R4LWNhbGVuZGFyLWNlbGwnKTtcclxuICAgICAgICByZXR1cm4gaXNDYWxlbmRhckNlbGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVMb2NhbGVzQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIGFwcGx5IG5ldyBsb2NhbGUgdG8gRFhcclxuICAgICAgICAvLyBpZiBhcnJheSBvZiBsb2NhbGVzIHdhcyBwcm92aWRlZCB1c2UgZmlyc3Qgb25lXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvY2FsZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxvY2FsZSh0aGlzLmxvY2FsZXMpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxvY2FsZXMpICYmIHRoaXMubG9jYWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxvY2FsZSh0aGlzLmxvY2FsZXNbMF0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydEJveD8uaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kQm94Py5pbnN0YW5jZS5yZXBhaW50KCk7XHJcbiAgICAgICAgdGhpcy5zaW5nbGVEYXRlUGlja2VyQm94Py5pbnN0YW5jZS5yZXBhaW50KCk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhcj8uaW5zdGFuY2UucmVwYWludCgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZVJhbmdlVGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ3VzdG9tVGV4dCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1c3RvbURhdGVSYW5nZS5uYW1lID0gdGhpcy50cmFuc2xhdGlvbnM/LmN1c3RvbVxyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRpb25zLmN1c3RvbVxyXG4gICAgICAgICAgICA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlRHhEZWZhdWx0Q2FsZW5kYXJGb2N1cygpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICAgJyNkYXRlcGlja2VyY29tcG9uZW50IC5keC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBlbGVtZW50ICYmXHJcbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdD8uY29udGFpbnMoJ2R4LWNhbGVuZGFyLXNlbGVjdGVkLWRhdGUnKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3Q/LnJlbW92ZSgnZHgtY2FsZW5kYXItc2VsZWN0ZWQtZGF0ZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFNlbGVjdGVkRGF0ZVJhbmdlVGV4dCgpe1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKSwgbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCkpO1xyXG4gICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQobmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCksIG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCkpO1xyXG4gICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQobmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCksIG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0b2dnbGVEYXRlUmFuZ2VTZWxlY3RvclZpc2liaWxpdHkoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yID1cclxuICAgICAgICAgICAgIXRoaXMuc2hvd1ByZWRlZmluZWRPcHRpb25zU2VsZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYW5nRGF0ZVJhbmdlKHJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UpIHtcclxuICAgICAgICB0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSByYW5nZTtcclxuXHJcbiAgICAgICAgaWYgKHJhbmdlID09PSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLm9wZW5EYXRlcGlja2VyUG9wdXAoKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSByYW5nZS5kYXRlRnJvbVxyXG4gICAgICAgICAgICAgICAgPyByYW5nZS5kYXRlRnJvbVxyXG4gICAgICAgICAgICAgICAgOiBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSByYW5nZS5kYXRlVG8gPyByYW5nZS5kYXRlVG8gOiBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZSh0aGlzLmRhdGVTdGFydCwgdGhpcy5kYXRlRW5kLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRGF0ZURpc2FibGVkID0gKGFyZ3M6IGFueSk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxvY2tCZWZvcmVEYXRlICYmIGlzQmVmb3JlKGFyZ3MuZGF0ZSwgdGhpcy5sb2NrQmVmb3JlRGF0ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoYXJncy5kYXRlLCBkYXkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1hdGNoRGF0ZVJhbmdlKGRhdGVGcm9tPzogRGF0ZSwgZGF0ZVRvPzogRGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZGF0ZUZyb20gfHwgIWRhdGVUbykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gdGhpcy5jdXN0b21EYXRlUmFuZ2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZSA9IHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh4LmRhdGVGcm9tIGFzIERhdGUsIGRhdGVGcm9tKSAmJlxyXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KHguZGF0ZVRvIGFzIERhdGUsIGRhdGVUbylcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChkYXRlUmFuZ2UubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSBkYXRlUmFuZ2VbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldERhdGVSYW5nZVRleHQoZGF0ZUZyb20/OiBEYXRlLCBkYXRlVG8/OiBEYXRlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VOYW1lID0gJyc7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9ICcnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKCEoZGF0ZUZyb20gaW5zdGFuY2VvZiBEYXRlKSB8fCAhKGRhdGVUbyBpbnN0YW5jZW9mIERhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJFU09MVkUgUEVSSU9EXHJcbiAgICAgICAgLy8gb25lIGRheVxyXG4gICAgICAgIGlmIChpc1NhbWVEYXkoZGF0ZUZyb20sIGRhdGVUbykpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpbmdsZURheUZvcm1hdEZuICE9PSAndW5kZWZpbmVkJyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5zaW5nbGVEYXlGb3JtYXRGbihkYXRlRnJvbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHlsZSA9PSAnY29tcGFjdCcgJiYgdGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdib3RoJyAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgIT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5mb3JtYXREYXRlKGRhdGVGcm9tKTsgIC8vc2tpcCBkYXkgbmFtZSwgYXMgd2UgaGF2ZSBjdXN0b20gdGV4dC5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlRnJvbSwgJ2RheS1sb25nJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZGF0ZSByYW5nZVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIC0gdXNlIHByb3ZpZGVkIGRhdGVSYW5nZSBmb3JtYXQgZnVuY3Rpb24gKGlmIGRlZmluZWQpXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRlUmFuZ2VGb3JtYXRGbiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmRhdGVSYW5nZUZvcm1hdEZuKGRhdGVGcm9tKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSB0aGlzLmRhdGVSYW5nZUZvcm1hdEZuKGRhdGVUbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZnVsbCBtb250aFxyXG4gICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheShkYXRlRnJvbSwgc3RhcnRPZk1vbnRoKGRhdGVGcm9tKSkgJiZcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheShkYXRlVG8sIGVuZE9mTW9udGgoZGF0ZVRvKSkgJiZcclxuICAgICAgICAgICAgICAgIGlzU2FtZU1vbnRoKGRhdGVGcm9tLCBkYXRlVG8pXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgICAgICAgICAgICAgICBkYXRlRnJvbSxcclxuICAgICAgICAgICAgICAgICAgICAnbW9udGgnXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGRhdGUgcmFuZ2UgLSB1c2UgZGVmYXVsdCBkYXRlIGZvcm1hdCBmdW5jdGlvblxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZyb20sXHJcbiAgICAgICAgICAgICAgICAgICAgaXNTYW1lWWVhcihkYXRlRnJvbSwgdG9kYXkpID8gJ2RheS1zaG9ydCcgOiAnZGF5J1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSB0aGlzLmZvcm1hdERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZVRvLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZVRvLCB0b2RheSkgPyAnZGF5LXNob3J0JyA6ICdkYXknXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zdHlsZSA9PSAnY29tcGFjdCcgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RTdHlsZURpc3BsYXkgPT0gJ3ByZWRlZmluZWRSYW5nZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VOYW1lID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MiA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdib3RoJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU5hbWUgPSB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLm5hbWUgKyAnLCAnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEBJbnB1dCgpIHB1YmxpYyBzdHlsZTogJ2NsYXNzaWMnIHwgJ2NvbXBhY3QnID0gJ2NsYXNzaWMnO1xyXG4gICAgICAgIC8vIEBJbnB1dCgpIHB1YmxpYyBjb21wYWN0U3R5bGVEaXNwbGF5OiAnZGF0ZScgfCAncHJlZGVmaW5lZFJhbmdlJyB8ICdib3RoJyA9ICdwcmVkZWZpbmVkUmFuZ2UnO1xyXG4gICAgICAgIC8vIGlmICh0aGlzLnN0eWxlID09ICdjb21wYWN0JyAmJiB0aGlzLmNvbXBhY3RTdHlsZURpc3BsYXkgPT0gJ3ByZWRlZmluZWRSYW5nZScgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLm5hbWU7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAodGhpcy5zdHlsZSA9PSAnY29tcGFjdCcgJiYgdGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdib3RoJyAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgIT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UubmFtZTtcclxuICAgICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MiA9ICcnO1xyXG4gICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9ybWF0RGF0ZShcclxuICAgICAgICBkYXRlOiBEYXRlLFxyXG4gICAgICAgIHR5cGU/OiAnbW9udGgnIHwgJ2RheScgfCAnZGF5LWxvbmcnIHwgJ2RheS1zaG9ydCcgfCB1bmRlZmluZWRcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZXMsIHtcclxuICAgICAgICAgICAgICAgICAgICBtb250aDogJ2xvbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICBkYXk6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYXNlICdkYXktbG9uZyc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheTogJ2xvbmcnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheS1zaG9ydCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZXMsIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXk6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICBtb250aDogJ3Nob3J0JyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZXMsIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXk6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICBtb250aDogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlRGF0ZVJhbmdlcyhmb3JjZT86IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCB0b2RheSA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoKSk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZm9yY2UgfHxcclxuICAgICAgICAgICAgIXRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlIHx8XHJcbiAgICAgICAgICAgICFpc1NhbWVEYXkodGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGUsIHRvZGF5KVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSA9IHRvZGF5O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlcyA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFByZWRlZmluZWREYXRlUmFuZ2VzKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlRGVmaW5pdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9kYXksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdERheU9mV2Vla1xyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlcyA9IFsuLi50aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzXTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VzLnB1c2godGhpcy5jdXN0b21EYXRlUmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIG1ldGhvZHNcclxufVxyXG4iLCI8IS0tIDxkaXYgaWQ9XCJkYXRlcGlja2VyYnV0dG9uc1wiPiAtLT5cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImRhdGVwaWNrZXIgZC1pbmxpbmUtZmxleCBiZy13aGl0ZSBzZHMtbm8tcHJpbnRcIlxyXG4gICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb21wb25lbnRBcmlhTGFiZWxcIlxyXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiXHJcbiAgICA+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZSA9PSAnY2xhc3NpYydcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZVJhbmdlRGVmaW5pdGlvbnMgJiYgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwaWNrZXJQcmVkZWZpbmVkUmFuZ2VEcm9wZG93bnt7IHJhbmRvbUlkUmVmZXJlbmNlIH19XCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBidG4gYnRuLXdoaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3VuZGVkLXN0YXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1lbmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcC0wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkcy1mdy00MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImRhdGVSYW5nZURlZmluaXRpb25zV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlUmFuZ2VTZWxlY3RvclZpc2liaWxpdHkoKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzLTIgbXMtMSBtZS0xIGRhdGUtcmFuZ2UtdGV4dCB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlbGVjdGVkRGF0ZVJhbmdlLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGRhdGUtcmFuZ2UtZHJvcGRvd24tYnV0dG9uIHNkcy1mdy00MDBcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIm9wZW5EYXRlUmFuZ2VEZWZpbml0aW9uc0FyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiZWxlbWVudFVVSUQgKyAnX3ByZWRlZmluZWRfcGVyaW9kc19kcm9wZG93bidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZHgtcG9wb3ZlclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZVJhbmdlRGVmaW5pdGlvbnMgJiYgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImVsZW1lbnRVVUlEICsgJ19wcmVkZWZpbmVkX3BlcmlvZHNfZHJvcGRvd24nXCJcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCIjcGlja2VyUHJlZGVmaW5lZFJhbmdlRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgIFsodmlzaWJsZSldPVwic2hvd1ByZWRlZmluZWRPcHRpb25zU2VsZWN0b3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt3cmFwcGVyQXR0cl09XCJ7IGNsYXNzOiAnc2RzLWRhdGVwaWNrZXItcmFuZ2VzLXBvcG92ZXIgc2RzLWR4LXBvcHVwLW5vLWFycm93JyB9XCJcclxuICAgICAgICAgICAgICAgICAgICBbbWluV2lkdGhdPVwiZGF0ZVJhbmdlRGVmaW5pdGlvbnNXaWR0aFwiXHJcblxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIiBjZGtUcmFwRm9jdXM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJhbmdlIG9mIGRhdGVSYW5nZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJlZGVmaW5lZC1kYXRlLXJhbmdlIHB4LTMgcHktMiB3LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJhbmdlID09PSBzZWxlY3RlZERhdGVSYW5nZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nRGF0ZVJhbmdlKHJhbmdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25SYW5nZUtleVJlbGVhc2VkKCRldmVudCwgcmFuZ2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cmFuZ2UubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2R4LXBvcG92ZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cInNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGJvcmRlciBib3JkZXItZW5kLTAgcGUtMiBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgW2NsYXNzLnJvdW5kZWQtc3RhcnRdID0gXCJzdHlsZSA9PSAnY29tcGFjdCcgfHwgKCFkYXRlUmFuZ2VEZWZpbml0aW9ucyB8fCBkYXRlUmFuZ2VEZWZpbml0aW9ucy5sZW5ndGggPT09IDApXCJcclxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zdGFydC0wXSA9IFwic3R5bGUgPT0gJ2NsYXNzaWMnICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwcmV2aW91c1BlcmlvZEFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01pbmltdW1MaW1pdCB8fCBkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNEYXRlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwicHJldmlvdXNQZXJpb2RJY29uXCI+PC9mYS1pY29uPlxyXG5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAjc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b25cclxuICAgICAgICAgICAgaWQ9XCJwaWNrZXJEcm9wZG93bnt7IHJhbmRvbUlkUmVmZXJlbmNlIH19XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGJvcmRlci10b3AgYm9yZGVyLWJvdHRvbSB0ZXh0LXRydW5jYXRlIHB4LTAgc2VsZWN0ZWQtcGVyaW9kIHNkcy1mdy00MDBcIlxyXG4gICAgICAgICAgICBbY2xhc3Mucm91bmRlZC1zdGFydF0gPSBcIighZGF0ZVJhbmdlRGVmaW5pdGlvbnMgfHwgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKSAmJiAhc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXN0YXJ0XSA9IFwiKCFkYXRlUmFuZ2VEZWZpbml0aW9ucyB8fCBkYXRlUmFuZ2VEZWZpbml0aW9ucy5sZW5ndGggPT09IDApICYmICFzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5yb3VuZGVkLWVuZF0gPSBcIiFzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZW5kXSA9IFwiIXNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzaG93RGF0ZXBpY2tlciA9ICFzaG93RGF0ZXBpY2tlclwiXHJcbiAgICAgICAgPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJ1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiIHNlbGVjdD1cImRpc3BsYXlcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhdXNlQ3VzdG9tRGlzcGxheUNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm14LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJjYWxlbmRhckljb25cIiBzaXplPVwic21cIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMSB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZhLWljb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXgtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInRvSWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXIgcm91bmRlZC1lbmQgYm9yZGVyLXN0YXJ0LTAgcHMtMiBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibmV4dFBlcmlvZEFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01heGltdW1MaW1pdCB8fCBkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV4dERhdGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJuZXh0UGVyaW9kSWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzZHMtcHJpbnQtb25seSBoLTEwMFwiPlxyXG5cclxuICAgICAgICA8bmctY29udGVudCAqbmdJZj1cInVzZUN1c3RvbURpc3BsYXlDb250ZW50XCIgc2VsZWN0PVwiZGlzcGxheVwiPjwvbmctY29udGVudD5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXVzZUN1c3RvbURpc3BsYXlDb250ZW50XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXgtMVwiPlxyXG4gICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiY2FsZW5kYXJJY29uXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0xIHRleHQtdHJ1bmNhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDF9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxmYS1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteC0yXCJcclxuICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ0b0ljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICA+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50Mn19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPGR4LXBvcG92ZXJcclxuICAgIHRhcmdldD1cIiNwaWNrZXJEcm9wZG93bnt7IHJhbmRvbUlkUmVmZXJlbmNlIH19XCJcclxuICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgIFsodmlzaWJsZSldPVwic2hvd0RhdGVwaWNrZXJcIlxyXG4gICAgKG9uSGlkaW5nKT1cIm9uSGlkZGVuQ2FsZW5kYXJQb3BvdmVyKClcIlxyXG4gICAgKG9uU2hvd2luZyk9XCJvblNob3dpbmdDYWxlbmRhclBvcG92ZXIoKVwiXHJcbiAgICBjbGFzcz1cIm0tMCBwLTBcIlxyXG4gICAgW3dyYXBwZXJBdHRyXT1cIntcclxuICAgICAgICBjbGFzczogJ3Nkcy1kYXRlcGlja2VyLXBvcG92ZXIgJyArIGRyb3Bkb3duV3JhcHBlckNsYXNzLFxyXG4gICAgICAgIGlkOiBkcm9wZG93bldyYXBwZXJJZFxyXG4gICAgfVwiXHJcbj5cclxuICAgIDxkeG8tYW5pbWF0aW9uPlxyXG4gICAgICAgIDxkeG8tc2hvd1xyXG4gICAgICAgICAgICB0eXBlPVwicG9wXCJcclxuICAgICAgICAgICAgW2Zyb21dPVwieyBzY2FsZTogMC45IH1cIlxyXG4gICAgICAgICAgICBbdG9dPVwieyBzY2FsZTogMSB9XCJcclxuICAgICAgICA+PC9keG8tc2hvdz5cclxuICAgICAgICA8ZHhvLWhpZGVcclxuICAgICAgICAgICAgdHlwZT1cImZhZGVcIlxyXG4gICAgICAgICAgICBbZnJvbV09XCIxXCJcclxuICAgICAgICAgICAgW3RvXT1cIjBcIlxyXG4gICAgICAgID48L2R4by1oaWRlPlxyXG4gICAgPC9keG8tYW5pbWF0aW9uPlxyXG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQpXCIgdGFiaW5kZXg9XCIxXCI+XHJcbiAgICAgICAgPGR4LXNjcm9sbC12aWV3PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3R5bGUgPT0gJ2NvbXBhY3QnICYmIGRhdGVSYW5nZXMubGVuZ3RoID4gMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gcC0zIGJnLWdyYXktMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWJzLWdyYXktMjAwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0cmFuc2xhdGlvbnMucHJlc2V0c1wiIGNsYXNzPVwicHgtMyBweS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyB0cmFuc2xhdGlvbnMucHJlc2V0cyB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmFuZ2Ugb2YgZGF0ZVJhbmdlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByZWRlZmluZWQtZGF0ZS1yYW5nZSBweC0zIHB5LTIgdy0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJhbmdlID09PSBzZWxlY3RlZERhdGVSYW5nZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdEYXRlUmFuZ2UocmFuZ2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3JhbmdlLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGF0ZXBpY2tlcmNvbXBvbmVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImRhdGUtaW5wdXRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHB4LTMgcHQtMyBwYi0yXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWREYXRlU3RhcnRCb3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBwLTEgbS0wIHRleHQtY2VudGVyIHJvdW5kZWQgZGF0ZXBpY2tlci1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cInNlbGVjdGVkRGF0ZUZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Ryb3BEb3duQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlTWFza0JlaGF2aW9yXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImRhdGVJbnB1dERpc3BsYXlGb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGUgfHwgbWluRGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4RGF0ZSB8fCBtYXhEYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmFsaWRdPVwiaXNWYWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25FcnJvcl09XCJ2YWxpZGF0aW9uRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRGF0ZVN0YXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25TdGFydERhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNJbik9XCJvblN0YXJ0RGF0ZUZvY3VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHB4LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInRvSWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWREYXRlRW5kQm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcC0xIG0tMCB0ZXh0LWNlbnRlciByb3VuZGVkIGRhdGVwaWNrZXItaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVJbnB1dF09XCIhc2VsZWN0ZWREYXRlRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VNYXNrQmVoYXZpb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZGF0ZUlucHV0RGlzcGxheUZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWREYXRlRW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25FbmREYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzSW4pPVwib25FbmREYXRlRm9jdXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWRhdGUtYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLXdoaXRlIG14LTIgcHgtMiBweS0yIGRhdGUtcGlja2VyLWRhdGUtc2VsZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZGF0ZS1pbnB1dHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHAtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NpbmdsZURhdGVQaWNrZXJCb3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcC0xIG0tMCB0ZXh0LWNlbnRlciByb3VuZGVkIGRhdGVwaWNrZXItaW5wdXQgZGF0ZXBpY2tlci1pbnB1dC1sYXJnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVJbnB1dF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlTWFza0JlaGF2aW9yXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJkYXRlSW5wdXREaXNwbGF5Rm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGUgfHwgbWluRGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25FcnJvcl09XCJ2YWxpZGF0aW9uRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWxlY3RlZERhdGVJbnRlcm5hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAob25WYWx1ZUNoYW5nZWQpPVwiIGNsb3NlRGF0ZXBpY2tlclBvcHVwKClcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RFbmREYXRlKCRldmVudClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2FsZW5kYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY2FsZW5kYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGUgfHwgbWluRGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4RGF0ZSB8fCBtYXhEYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZXNdPVwiaXNEYXRlRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1ZhbGlkXT1cImlzVmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcgPyBzZWxlY3RlZERhdGVDYWxlbmRhciA6IHNlbGVjdGVkRGF0ZUludGVybmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25EYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaXJzdERheU9mV2Vla109XCJmaXJzdERheU9mV2Vla1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHhUZW1wbGF0ZT1cImxldCBjZWxsRGF0YSBvZiAnY2VsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ2gtMTAwIHB0LTEnICsgZ2V0Q2VsbENzc0NsYXNzKGNlbGxEYXRhLmRhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxpbmUtaGVpZ2h0LnB4XT1cIjIzXCJcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9ja0JlZm9yZURhdGUgJiYgKGNlbGxEYXRhLmRhdGUgfCBzZHNEYXRlQ29tcGFyZTogbG9ja0JlZm9yZURhdGUgOiAnbHRlJyk7IHRoZW4gdGhlbkxvY2tCbG9jayBlbHNlIGVsc2VEZWZhdWx0QmxvY2tcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aGVuTG9ja0Jsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW3RpdGxlXT1cImxvY2tCZWZvcmVEYXRlSGludFwiIFtpY29uXT1cImxvY2tJY29uXCIgIGNsYXNzPVwibG9ja2VkLWRheSBwb3NpdGlvbi1hYnNvbHV0ZS14XCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Vsc2VEZWZhdWx0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsRGF0YS50ZXh0IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIHB4LTMgcHQtMiBwYi0zXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEYXRlcGlja2VyID0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zbGF0aW9ucy5jYW5jZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoY2xpY2spPVwiY2xvc2VEYXRlcGlja2VyUG9wdXAoKVwiIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtcy0xIHNkcy1mdy00MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVBlcmlvZFBpY2tlcigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0cmFuc2xhdGlvbnMuYXBwbHl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxyXG4gICAgPC9kaXY+XHJcbjwvZHgtcG9wb3Zlcj5cclxuPCEtLSA8L2Rpdj4gLS0+XHJcblxyXG4iXX0=