@tsi-developpement/tsi-shared-ui 1.11.11 → 1.11.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +3 -3
- package/esm2022/lib/tsi-components/reporting/reporting.component.mjs +8 -3
- package/esm2022/lib/tsi-components/tsi-form/tsi-form.component.mjs +3 -3
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +10 -6
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
- package/lib/consts/app-providers.d.ts +1 -1
- package/lib/tsi-components/reporting/reporting.component.d.ts +2 -0
- package/package.json +1 -1
package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs
CHANGED
|
@@ -814,11 +814,11 @@ export class EditableGridComponent extends TsiInputBase {
|
|
|
814
814
|
return `${EditableGridComponent.SEARCH_LABEL_PREFIX}${column.field}`;
|
|
815
815
|
}
|
|
816
816
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableGridComponent, deps: [{ token: i1.LocalizePipe }, { token: i2.FilterService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
817
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditableGridComponent, selector: "Tsi-Generic-Editable-Grid", inputs: { selectedItems: "selectedItems", configuration: "configuration", key: "key", items: "items", saveEvent: "saveEvent", showGlobalSearch: "showGlobalSearch", showAddButton: "showAddButton", showDeleteButton: "showDeleteButton", showEditButton: "showEditButton", showRowSummary: "showRowSummary", scrollHeight: "scrollHeight", sizingMode: "sizingMode", rowPerPage: "rowPerPage", pageSize: "pageSize", entityPrimaryKeyName: "entityPrimaryKeyName", columns: "columns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", showSaveButton: "showSaveButton", showActionColumn: "showActionColumn", enableRowDisabling: "enableRowDisabling", rowSummaryConfig: "rowSummaryConfig", showHaveSumary: "showHaveSumary", showRowSumary: "showRowSumary", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", showConsultButton: "showConsultButton", editableGridBusinessClass: "editableGridBusinessClass", orderColumn: "orderColumn", deleteLineButtonDisabled: "deleteLineButtonDisabled", showDuplicateButton: "showDuplicateButton", id: "id" }, outputs: { refreshEventEmitter: "refreshEventEmitter", saveDataEventEmitter: "saveDataEventEmitter", rowChangedEventEmitter: "rowChangedEventEmitter", selectedRowEventEmitter: "selectedRowEventEmitter", addedRowEventEmitter: "addedRowEventEmitter", focusOutEventEmitter: "focusOutEventEmitter", cellChanged: "cellChanged", rowDeletedEventEmitter: "rowDeletedEventEmitter", selectedItemsChange: "selectedItemsChange", onRowSelect: "onRowSelect", focusOutRow: "focusOutRow", onConsultClicked: "onConsultClicked", rowDuplicatedEventEmitter: "rowDuplicatedEventEmitter" }, host: { listeners: { "document:keydown": "handleGridKeydown($event)" } }, providers: [GenericValidationStateService], viewQueries: [{ propertyName: "editableTable", first: true, predicate: ["editableTable"], descendants: true }, { propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n (onColResize)=\"onColResize($event)\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" [styleClass]=\"'p-datatable-sm p-datatable-gridlines' + (stripedRows ? ' p-datatable-striped' : '')\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\"\r\n [globalFilterFields]=\"globalFilterFields\" [rowTrackBy]=\"rowTrackBy\" [tableStyle]=\"tableStyle\">\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex items-center gap-5 flex-row\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n <div *ngIf=\"showGlobalSearch\" class=\"flex items-center gap-1 w-8\">\r\n <div presentationDesignerBase=\"global_search\" class=\"p-inputgroup rtl-mode h-2rem no-pad\">\r\n <input class=\"\" type=\"text\" [(ngModel)]=\"searchValue\" pInputText class=\"border-round-lg\"\r\n [placeholder]=\"'shared_edittable_search_placeholder' | localize\" (keydown.enter)=\"applyGlobalSearch()\">\r\n </div>\r\n <div presentationDesignerBase=\"search_button\">\r\n <Tsi-Button styleClass=\"p-button-icon-only\" type=\"button\" icon=\"pi pi-search\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_search\"\r\n (onClick)=\"applyGlobalSearch()\" />\r\n </div>\r\n </div>\r\n </div> \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDuplicateButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\"\r\n [attr.data-field]=\"col.field\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n [ngStyle]=\"getBodyColumnStyle(col)\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc>\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [currency]=\"col.currencyOtherCode\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" \r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDuplicateButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\" [ngStyle]=\"getBodyColumnStyle(col)\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [currency]=\"col.currencyOtherCode\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}.tsi-col-wrap,.tsi-col-wrap>span,.tsi-col-wrap>div{white-space:normal!important;overflow-wrap:anywhere;word-break:break-word}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i6.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i6.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i6.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i6.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i6.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i6.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i6.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i6.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i6.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i9.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "selectOnFocus", "resetFilterOnHide", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "searchDebounceTime", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i10.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i11.TsiCurrencyOtherInputComponent, selector: "Tsi-Currency-Other-Input", inputs: ["currency", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i12.TsiCurrencySocieteInputComponent, selector: "Tsi-Currency-Societe-Input", inputs: ["class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i13.TsiDatePickerComponent, selector: "Tsi-Date-Picker", inputs: ["required", "showTime", "showButtonBar"], outputs: ["inputFieldChange"] }, { kind: "component", type: i14.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i15.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i16.TsiRateInputComponent, selector: "Tsi-Rate-Input", inputs: ["required", "isFraction", "numOfDecimal"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i17.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i18.TsiFormulaBoxComponent, selector: "Tsi-Formula-Box", inputs: ["value", "endPoint"], outputs: ["valueChange"] }, { kind: "component", type: i19.TsiTimePickerComponent, selector: "tsi-time-picker", outputs: ["inputFieldChange"] }, { kind: "component", type: i20.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i21.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["currency", "inputData"] }, { kind: "component", type: i22.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i23.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i24.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i25.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i26.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i27.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i28.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i29.TsiTimeDisplayComponent, selector: "tsi-time-display", inputs: ["inputData"] }, { kind: "directive", type: i30.PresentationDesignerDirectiveBase, selector: "[presentationDesignerBase]:not(tsi-tab-panel)", inputs: ["presentationDesigner", "presentationDesignerBase"] }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }] }); }
|
|
817
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditableGridComponent, selector: "Tsi-Generic-Editable-Grid", inputs: { selectedItems: "selectedItems", configuration: "configuration", key: "key", items: "items", saveEvent: "saveEvent", showGlobalSearch: "showGlobalSearch", showAddButton: "showAddButton", showDeleteButton: "showDeleteButton", showEditButton: "showEditButton", showRowSummary: "showRowSummary", scrollHeight: "scrollHeight", sizingMode: "sizingMode", rowPerPage: "rowPerPage", pageSize: "pageSize", entityPrimaryKeyName: "entityPrimaryKeyName", columns: "columns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", showSaveButton: "showSaveButton", showActionColumn: "showActionColumn", enableRowDisabling: "enableRowDisabling", rowSummaryConfig: "rowSummaryConfig", showHaveSumary: "showHaveSumary", showRowSumary: "showRowSumary", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", showConsultButton: "showConsultButton", editableGridBusinessClass: "editableGridBusinessClass", orderColumn: "orderColumn", deleteLineButtonDisabled: "deleteLineButtonDisabled", showDuplicateButton: "showDuplicateButton", id: "id" }, outputs: { refreshEventEmitter: "refreshEventEmitter", saveDataEventEmitter: "saveDataEventEmitter", rowChangedEventEmitter: "rowChangedEventEmitter", selectedRowEventEmitter: "selectedRowEventEmitter", addedRowEventEmitter: "addedRowEventEmitter", focusOutEventEmitter: "focusOutEventEmitter", cellChanged: "cellChanged", rowDeletedEventEmitter: "rowDeletedEventEmitter", selectedItemsChange: "selectedItemsChange", onRowSelect: "onRowSelect", focusOutRow: "focusOutRow", onConsultClicked: "onConsultClicked", rowDuplicatedEventEmitter: "rowDuplicatedEventEmitter" }, host: { listeners: { "document:keydown": "handleGridKeydown($event)" } }, providers: [GenericValidationStateService], viewQueries: [{ propertyName: "editableTable", first: true, predicate: ["editableTable"], descendants: true }, { propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n (onColResize)=\"onColResize($event)\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" [styleClass]=\"'p-datatable-sm p-datatable-gridlines' + (stripedRows ? ' p-datatable-striped' : '')\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\"\r\n [globalFilterFields]=\"globalFilterFields\" [rowTrackBy]=\"rowTrackBy\" [tableStyle]=\"tableStyle\">\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex items-center gap-5 flex-row\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n <div *ngIf=\"showGlobalSearch\" class=\"flex items-center gap-1 w-8\">\r\n <div presentationDesignerBase=\"global_search\" class=\"p-inputgroup rtl-mode h-2rem no-pad\">\r\n <input class=\"\" type=\"text\" [(ngModel)]=\"searchValue\" pInputText class=\"border-round-lg\"\r\n [placeholder]=\"'shared_edittable_search_placeholder' | localize\" (keydown.enter)=\"applyGlobalSearch()\">\r\n </div>\r\n <div presentationDesignerBase=\"search_button\">\r\n <Tsi-Button styleClass=\"p-button-icon-only\" type=\"button\" icon=\"pi pi-search\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_search\"\r\n (onClick)=\"applyGlobalSearch()\" />\r\n </div>\r\n </div>\r\n </div> \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDuplicateButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\"\r\n [attr.data-field]=\"col.field\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td pFrozenColumn style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n [ngStyle]=\"getBodyColumnStyle(col)\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc>\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [currency]=\"col.currencyOtherCode\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" \r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDuplicateButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\" [ngStyle]=\"getBodyColumnStyle(col)\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [currency]=\"col.currencyOtherCode\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}.tsi-col-wrap,.tsi-col-wrap>span,.tsi-col-wrap>div{white-space:normal!important;overflow-wrap:anywhere;word-break:break-word}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i6.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i6.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i6.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i6.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i6.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i6.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i6.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i6.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i6.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i9.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "selectOnFocus", "resetFilterOnHide", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "searchDebounceTime", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i10.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i11.TsiCurrencyOtherInputComponent, selector: "Tsi-Currency-Other-Input", inputs: ["currency", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i12.TsiCurrencySocieteInputComponent, selector: "Tsi-Currency-Societe-Input", inputs: ["class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i13.TsiDatePickerComponent, selector: "Tsi-Date-Picker", inputs: ["required", "showTime", "showButtonBar"], outputs: ["inputFieldChange"] }, { kind: "component", type: i14.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i15.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i16.TsiRateInputComponent, selector: "Tsi-Rate-Input", inputs: ["required", "isFraction", "numOfDecimal"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i17.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i18.TsiFormulaBoxComponent, selector: "Tsi-Formula-Box", inputs: ["value", "endPoint"], outputs: ["valueChange"] }, { kind: "component", type: i19.TsiTimePickerComponent, selector: "tsi-time-picker", outputs: ["inputFieldChange"] }, { kind: "component", type: i20.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i21.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["currency", "inputData"] }, { kind: "component", type: i22.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i23.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i24.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i25.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i26.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i27.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i28.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i29.TsiTimeDisplayComponent, selector: "tsi-time-display", inputs: ["inputData"] }, { kind: "directive", type: i30.PresentationDesignerDirectiveBase, selector: "[presentationDesignerBase]:not(tsi-tab-panel)", inputs: ["presentationDesigner", "presentationDesignerBase"] }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }] }); }
|
|
818
818
|
}
|
|
819
819
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableGridComponent, decorators: [{
|
|
820
820
|
type: Component,
|
|
821
|
-
args: [{ selector: 'Tsi-Generic-Editable-Grid', providers: [GenericValidationStateService], template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n (onColResize)=\"onColResize($event)\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" [styleClass]=\"'p-datatable-sm p-datatable-gridlines' + (stripedRows ? ' p-datatable-striped' : '')\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\"\r\n [globalFilterFields]=\"globalFilterFields\" [rowTrackBy]=\"rowTrackBy\" [tableStyle]=\"tableStyle\">\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex items-center gap-5 flex-row\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n <div *ngIf=\"showGlobalSearch\" class=\"flex items-center gap-1 w-8\">\r\n <div presentationDesignerBase=\"global_search\" class=\"p-inputgroup rtl-mode h-2rem no-pad\">\r\n <input class=\"\" type=\"text\" [(ngModel)]=\"searchValue\" pInputText class=\"border-round-lg\"\r\n [placeholder]=\"'shared_edittable_search_placeholder' | localize\" (keydown.enter)=\"applyGlobalSearch()\">\r\n </div>\r\n <div presentationDesignerBase=\"search_button\">\r\n <Tsi-Button styleClass=\"p-button-icon-only\" type=\"button\" icon=\"pi pi-search\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_search\"\r\n (onClick)=\"applyGlobalSearch()\" />\r\n </div>\r\n </div>\r\n </div> \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDuplicateButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\"\r\n [attr.data-field]=\"col.field\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n [ngStyle]=\"getBodyColumnStyle(col)\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc>\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [currency]=\"col.currencyOtherCode\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" \r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDuplicateButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\" [ngStyle]=\"getBodyColumnStyle(col)\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [currency]=\"col.currencyOtherCode\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}.tsi-col-wrap,.tsi-col-wrap>span,.tsi-col-wrap>div{white-space:normal!important;overflow-wrap:anywhere;word-break:break-word}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"] }]
|
|
821
|
+
args: [{ selector: 'Tsi-Generic-Editable-Grid', providers: [GenericValidationStateService], template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n (onColResize)=\"onColResize($event)\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" [styleClass]=\"'p-datatable-sm p-datatable-gridlines' + (stripedRows ? ' p-datatable-striped' : '')\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\"\r\n [globalFilterFields]=\"globalFilterFields\" [rowTrackBy]=\"rowTrackBy\" [tableStyle]=\"tableStyle\">\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex items-center gap-5 flex-row\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n <div *ngIf=\"showGlobalSearch\" class=\"flex items-center gap-1 w-8\">\r\n <div presentationDesignerBase=\"global_search\" class=\"p-inputgroup rtl-mode h-2rem no-pad\">\r\n <input class=\"\" type=\"text\" [(ngModel)]=\"searchValue\" pInputText class=\"border-round-lg\"\r\n [placeholder]=\"'shared_edittable_search_placeholder' | localize\" (keydown.enter)=\"applyGlobalSearch()\">\r\n </div>\r\n <div presentationDesignerBase=\"search_button\">\r\n <Tsi-Button styleClass=\"p-button-icon-only\" type=\"button\" icon=\"pi pi-search\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_search\"\r\n (onClick)=\"applyGlobalSearch()\" />\r\n </div>\r\n </div>\r\n </div> \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDuplicateButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\"\r\n [attr.data-field]=\"col.field\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td pFrozenColumn style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\"\r\n [ngStyle]=\"getBodyColumnStyle(col)\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc>\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [currency]=\"col.currencyOtherCode\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" \r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDuplicateButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\" [ngStyle]=\"getBodyColumnStyle(col)\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (selectedLabelChange)=\"onCellLabelResolved(col, $event, item)\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [currency]=\"col.currencyOtherCode\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [isBinary]=\"col.isBinary ?? false\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" [ngStyle]=\"getColumnSizeStyle(col)\" scope=\"col\" *ngFor=\"let col of columns\"\r\n [class.tsi-col-wrap]=\"shouldWrapColumn(col)\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}.tsi-col-wrap,.tsi-col-wrap>span,.tsi-col-wrap>div{white-space:normal!important;overflow-wrap:anywhere;word-break:break-word}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"] }]
|
|
822
822
|
}], ctorParameters: () => [{ type: i1.LocalizePipe }, { type: i2.FilterService }], propDecorators: { editableTable: [{
|
|
823
823
|
type: ViewChild,
|
|
824
824
|
args: ["editableTable"]
|
|
@@ -923,4 +923,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
923
923
|
type: HostListener,
|
|
924
924
|
args: ['document:keydown', ['$event']]
|
|
925
925
|
}] } });
|
|
926
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy9lZGl0YWJsZS1ncmlkL2VkaXRhYmxlLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvZWRpdGFibGUtZ3JpZC9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUc1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQWdELE1BQU0sa0RBQWtELENBQUM7QUFDeEksT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDbkcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMs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ekIsRUFBRTtzQkFBVixLQUFLO2dCQWdiTixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRmlsdGVyU2VydmljZSwgU29ydEV2ZW50LCBUYWJsZVN0YXRlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBUYWJsZSwgVGFibGVSb3dTZWxlY3RFdmVudCwgVGFibGVSb3dVblNlbGVjdEV2ZW50IH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBCdXR0b25UeXBlLCBHcmlkU2VsZWN0aW9uTW9kZSwgSW5wdXRUeXBlcywgTW9kYWxTaXplRW51bSwgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBwcmVjaXNlQWRkLCBwcmVjaXNlU3VtIH0gZnJvbSAnLi4vLi4vLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgQ2VsbENoYW5nZWRSZXN1bHQsIEdyaWRDb2x1bW4sIElHcmlkQ29uZmlndXJhdGlvbiwgUm93QWRkZWRSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgTG9jYWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvbG9jYWxpemUucGlwZSc7XHJcbmltcG9ydCB7IENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24sIENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIE9ic2VydmFibGVDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbGxlY3Rpb24vb2JzZXJ2YWJsZS1jb2xsZWN0aW9uJztcclxuaW1wb3J0IHsgRW50aXR5VmFsaWRhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9lbnRpdHktdmFsaWRhdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IEdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgeyBGb3JtU3RhdGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZm9ybS9mb3JtLXN0YXRlJztcclxuaW1wb3J0IHsgVHNpSW5wdXRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWJhc2UvdHNpLWlucHV0LWJhc2UvdHNpLWlucHV0LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29sdW1uV2lkdGhDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvY29sdW1uLXdpZHRoLmNvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBHcmlkU2l6aW5nTW9kZSB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2dyaWQtc2l6aW5nLW1vZGUnO1xyXG5pbXBvcnQgeyBMYXlvdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGF5b3V0L2xheW91dC1oZWxwZXIuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1HZW5lcmljLUVkaXRhYmxlLUdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbR2VuZXJpY1ZhbGlkYXRpb25TdGF0ZVNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUdyaWRDb21wb25lbnQgZXh0ZW5kcyBUc2lJbnB1dEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbG9jYWwgdmFyc1xyXG4gIHByaXZhdGUgc2F2ZUV2ZW50U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2lzQXV0b1Jvd051bWJlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2F1dG9Sb3dOdW1iZXJGaWVsZDogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFJvd051bWJlcjogbnVtYmVyID0gMDtcclxuICB0b29sdGlwUG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb247XHJcbiAgaXNBcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2dyaWREYXRhOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcHJpdmF0ZSBfZXF1YXRhYmxlRmllbGRzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3N1bUF0RnVzaW9uRmllbGRzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VxdWFsaXR5Q2hlY2tPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2Y2U291cmNlUm93OiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BlbmRpbmdEdXBsaWNhdGVFbWl0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdDogUm93QWRkZWRSZXN1bHQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUFSQ0hfTEFCRUxfUFJFRklYID0gJ19fc2VhcmNoX2xhYmVsX18nO1xyXG5cclxuICAvKipcclxuICAgKiBOYW1lIG9mIHRoZSBjdXN0b20gUHJpbWVORyBmaWx0ZXIgcmVnaXN0ZXJlZCBmb3IgZ2xvYmFsIHNlYXJjaC5cclxuICAgKiBFeHRlbmRzIHRoZSBidWlsdC1pbiAnY29udGFpbnMnIHdpdGggbG9jYWxlLWF3YXJlIGRlY2ltYWwgbWF0Y2hpbmdcclxuICAgKiAoY29tbWEgdnMgZG90IHNlcGFyYXRvcikgd2hpbGUga2VlcGluZyBmdWxsIHByb3RlY3Rpb24gYWdhaW5zdCBmYWxzZVxyXG4gICAqIHBvc2l0aXZlcyBvbiB0ZXh0IGNvbHVtbnMuXHJcbiAgICogQHNlZSBfcmVnaXN0ZXJHcmlkQ29udGFpbnNGaWx0ZXJcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUNJTUFMX0FXQVJFX0NPTlRBSU5TX0ZJTFRFUiA9ICdncmlkLWNvbnRhaW5zJztcclxuICBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGU7XHJcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICAvLyNlbmRyZWdpb25cclxuICBpbnB1dFR5cGVzID0gSW5wdXRUeXBlcztcclxuICBtb2RhbFNpemUgPSBNb2RhbFNpemVFbnVtLkV4dHJhTGFyZ2U7XHJcbiAgQFZpZXdDaGlsZChcImVkaXRhYmxlVGFibGVcIikgZWRpdGFibGVUYWJsZT86IFRhYmxlXHJcblxyXG4gIGJ1dHRvblR5cGUgPSBCdXR0b25UeXBlO1xyXG5cclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1zOiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZEl0ZW06IGFueTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbnB1dHNcclxuICBASW5wdXQoJ2NvbmZpZ3VyYXRpb24nKSBjb25maWd1cmF0aW9uPzogSUdyaWRDb25maWd1cmF0aW9uO1xyXG4gIEBJbnB1dCgna2V5Jykga2V5OiBzdHJpbmcgPSAndWlkJztcclxuICBASW5wdXQoKSBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIHNhdmVFdmVudD86IE9ic2VydmFibGU8dm9pZD47XHJcbiAgLyoqXHJcbiAgICogQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGdsb2JhbCBzZWFyY2ggYmFyIGluIHRoZSBncmlkIGNhcHRpb24uXHJcbiAgICpcclxuICAgKiBXaGVuIGB0cnVlYCwgYSBzZWFyY2ggaW5wdXQgYW5kIGJ1dHRvbiBhcmUgZGlzcGxheWVkLCBhbGxvd2luZyB1c2VycyB0b1xyXG4gICAqIGZpbHRlciByb3dzIGFjcm9zcyBhbGwgdmlzaWJsZSBjb2x1bW5zIHNpbXVsdGFuZW91c2x5LiBTdXBwb3J0cyBwbGFpbiB0ZXh0LFxyXG4gICAqIGRyb3Bkb3duIGxhYmVscyAocmVzb2x2ZWQgdmlhIHNoYWRvdyBmaWVsZHMpLCBhbmQgZGVjaW1hbCB2YWx1ZXMgd2l0aFxyXG4gICAqIGxvY2FsZS1hd2FyZSBjb21tYS9kb3QgbWF0Y2hpbmcuXHJcbiAgICpcclxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIHRvIHByZXNlcnZlIHRoZSBleGlzdGluZyBiZWhhdmlvdXIgZm9yIGFsbCBjb25zdW1lcnNcclxuICAgKiB0aGF0IGRvIG5vdCBleHBsaWNpdGx5IG9wdCBpbiDigJQgZW5hYmxpbmcgaXQgb24gYSBzcGVjaWZpYyBncmlkIGlzIGFzIHNpbXBsZVxyXG4gICAqIGFzIGFkZGluZyBgW3Nob3dHbG9iYWxTZWFyY2hdPVwidHJ1ZVwiYC5cclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93R2xvYmFsU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcbiAgQElucHV0KCkgc2hvd0RlbGV0ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93RWRpdEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93Um93U3VtbWFyeTogYm9vbGVhbiA9IGZhbHNlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcblxyXG4gIEBJbnB1dCgpIHNjcm9sbEhlaWdodDogc3RyaW5nID0gJzUwMHB4JztcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsbCAoZGVmYXVsdCk6IHRoZSB0YWJsZSBzdHJldGNoZXMgdG8gZmlsbCBpdHMgY29udGFpbmVyLiBIdWc6IHRoZSB0YWJsZSBzaHJpbmtzIHRvXHJcbiAgICogaXRzIGNvbHVtbnMnIHNpemUgKG5ldmVyIHdpZGVyIHRoYW4gdGhlIGNvbnRhaW5lciksIGxlYXZpbmcgbGVmdG92ZXIgd2lkdGggZW1wdHkuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2l6aW5nTW9kZTogR3JpZFNpemluZ01vZGUgPSBHcmlkU2l6aW5nTW9kZS5GaWxsO1xyXG5cclxuICAvKipcclxuICAgKiBTaXppbmcgc3R5bGUgYm91bmQgdG8gdGhlIHAtdGFibGUncyBgW3RhYmxlU3R5bGVdYCDigJQgdGhlIHNpbmdsZSBsZXZlciB0aGF0IGRpc3Rpbmd1aXNoZXNcclxuICAgKiBGaWxsIGZyb20gSHVnIChzZWUgR3JpZFNpemluZ01vZGUpLiBBcHBsaWVkIGlubGluZSBvbiB0aGUgUHJpbWVORyB0YWJsZSwgc28gaXQgYmVhdHNcclxuICAgKiBQcmltZU5HJ3MgZGVmYXVsdCBgLnAtZGF0YXRhYmxlLXRhYmxlIHsgd2lkdGg6IDEwMCUgfWAgd2l0aCBubyBgIWltcG9ydGFudGAvYDo6bmctZGVlcGAuXHJcbiAgICogLSBGaWxsOiBkZWZhdWx0IChubyBmb3JjZWQgd2lkdGg7IFByaW1lTkcgZmlsbHMgdGhlIGNvbnRhaW5lcikuXHJcbiAgICogLSBIdWc6IGB3aWR0aDphdXRvYCBzaHJpbmtzIHRoZSB0YWJsZSB0byBpdHMgY29sdW1uczsgYG1heC13aWR0aDoxMDAlYCBrZWVwcyBpdCBpbnNpZGUgdGhlXHJcbiAgICogICBwYWdlIChvdmVyZmxvdyBzY3JvbGxzKTsgYG1pbi13aWR0aDowYCBhdm9pZHMgYW55IGluaGVyaXRlZCBmbG9vci5cclxuICAgKlxyXG4gICAqIEh1ZyArIGBjb2x1bW5SZXNpemVNb2RlPVwiZXhwYW5kXCJgOiBkcmFnZ2luZyBhIGNvbHVtbiByZXNpemVzIHRoYXQgY29sdW1uLCBidXQgYHdpZHRoOmF1dG9gXHJcbiAgICogaXMgcmUtYXNzZXJ0ZWQgb24gY2hhbmdlIGRldGVjdGlvbiwgc28gdGhlIHRhYmxlIGl0c2VsZiBzdGF5cyBodWdnZWQgYW5kIG5ldmVyIGV4cGFuZHMuXHJcbiAgICovXHJcbiAgZ2V0IHRhYmxlU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXppbmdNb2RlID09PSBHcmlkU2l6aW5nTW9kZS5IdWdcclxuICAgICAgPyB7ICd3aWR0aCc6ICdhdXRvJywgJ21pbi13aWR0aCc6ICcwJywgJ21heC13aWR0aCc6ICcxMDAlJyB9XHJcbiAgICAgIDoge307XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHJvd1BlclBhZ2U6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XHJcbiAgLy8gQElucHV0KCkgaXNQYWdpbmF0b3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSA1XHJcbiAgQElucHV0KCkgZW50aXR5UHJpbWFyeUtleU5hbWUgOiBzdHJpbmcgPSAndWlkJ1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcblxyXG4gIGdldCBzZWxlY3RlZENvbHVtbnMoKTogQXJyYXk8R3JpZENvbHVtbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHNldCBzZWxlY3RlZENvbHVtbnModmFsdWU6IEFycmF5PEdyaWRDb2x1bW4+KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3N5bmNHbG9iYWxGaWx0ZXJGaWVsZHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgcHJpdmF0ZSBfdGVtcENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgcHJpdmF0ZSBfY29sdW1uc0NoYW5nZWRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgLyoqIENvbHVtbiBvcmRlciBvZiB0aGUgcHJlc2VudGF0aW9uIGxhc3QgcmVzdG9yZWQuIEtlcHQgc28gY29sdW1ucyB0aGF0IG9ubHkgYXJyaXZlIGFmdGVyd2FyZHNcclxuICAgKiAg4oCUIHRoZSBvd25lciBidWlsZHMgb3IgaW5zZXJ0cyB0aGVtIG9uIGFzeW5jIHJlc3BvbnNlcyDigJQgYXJlIGxhaWQgb3V0IHBlciB0aGF0IHNhdmVkIGxheW91dFxyXG4gICAqICBpbnN0ZWFkIG9mIHJlc2V0dGluZyBpdCB0byBcImV2ZXJ5IGNvbHVtbiwgZGVmYXVsdCBvcmRlclwiLiAqL1xyXG4gIHByaXZhdGUgX3Jlc3RvcmVkQ29sdW1uT3JkZXI/OiBzdHJpbmdbXTtcclxuXHJcbiAgZ2V0IGNvbHVtbnMoKTogQXJyYXk8R3JpZENvbHVtbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgY29sdW1ucyh2YWx1ZTogQXJyYXk8R3JpZENvbHVtbj4gfCBPYnNlcnZhYmxlQ29sbGVjdGlvbjxHcmlkQ29sdW1uPikge1xyXG4gICAgdGhpcy5fY29sdW1uc0NoYW5nZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgaXNPYnNlcnZhYmxlID0gKHZhbHVlIGFzIE9ic2VydmFibGVDb2xsZWN0aW9uPEdyaWRDb2x1bW4+KS5pc09ic2VydmFibGVDb2xsZWN0aW9uID09PSB0cnVlO1xyXG4gICAgY29uc3QgaXRlbXMgPSBpc09ic2VydmFibGUgPyAodmFsdWUgYXMgT2JzZXJ2YWJsZUNvbGxlY3Rpb248R3JpZENvbHVtbj4pLnRvQXJyYXkoKSA6IHZhbHVlIGFzIEFycmF5PEdyaWRDb2x1bW4+O1xyXG4gICAgaXRlbXMuZm9yRWFjaChlbCA9PiBlbC50cmFuc2xhdGVkSGVhZGVyID0gdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybShlbC5oZWFkZXIgPz8gXCJcIikpO1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBbLi4uaXRlbXNdO1xyXG4gICAgdGhpcy5fcmVhcHBseVJlc3RvcmVkQ29sdW1uT3JkZXIoKTtcclxuXHJcbiAgICBpZiAoaXNPYnNlcnZhYmxlKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNDaGFuZ2VkU3Vic2NyaXB0aW9uID0gKHZhbHVlIGFzIE9ic2VydmFibGVDb2xsZWN0aW9uPEdyaWRDb2x1bW4+KS5jaGFuZ2VkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJldmVudCBjaGFuZ2VkID0+IFwiLCBldmVudClcclxuICAgICAgICB0aGlzLl9vbkNvbHVtbnNDaGFuZ2VkKGV2ZW50KVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92ZXJpZnlHcmlkUmVxdWlyZW1lbnRzKCk7XHJcbiAgICB0aGlzLl9pbml0Q3VycmVudFJvd051bWJlckFuZE9yZGVyQnlSb3dOdW1iZXIoKTtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IGdyaWREYXRhKGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIHRoaXMuX2dyaWREYXRhID0gZGF0YTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gIH1cclxuICBnZXQgZ3JpZERhdGEoKSB7IHJldHVybiB0aGlzLl9ncmlkRGF0YTsgfVxyXG5cclxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XHJcblxyXG5cclxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NhdmVCdXR0b246IGJvb2xlYW4gPSB0cnVlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkNvbHVtbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuXHJcblxyXG4gIEBJbnB1dCgpIGVuYWJsZVJvd0Rpc2FibGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSByb3dTdW1tYXJ5Q29uZmlnOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgQElucHV0KCkgc2hvd0hhdmVTdW1hcnk/OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd1Jvd1N1bWFyeT86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqc2VsZWN0aW9uICovXHJcbiAgQElucHV0KCkgc2VsZWN0S2V5T25seTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkgPSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGU7XHJcbiAgQElucHV0KCkgc2hvd0NvbnN1bHRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzczogc3RyaW5nID0gXCJcIjtcclxuICBnZXQgZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzO1xyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcyhjbGFzc05hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcyA9IGNsYXNzTmFtZTtcclxuICAgIHRoaXMuZ2VuZXJpY1ZhbGlkYXRpb25TdGF0ZVNlcnZpY2U/LmxvYWRFbnRpdHlWYWxpZGF0aW9uSW5mb3ModGhpcy5fZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqb3JkZXIgKi9cclxuICBASW5wdXQoKSBvcmRlckNvbHVtbjogc3RyaW5nID0gJ3VpZCc7XHJcblxyXG4gIEBJbnB1dCgpIGRlbGV0ZUxpbmVCdXR0b25EaXNhYmxlZCE6IChpdGVtOiBhbnkpID0+IGFueVxyXG5cclxuICBASW5wdXQoKSBzaG93RHVwbGljYXRlQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcblxyXG4gIEBPdXRwdXQoKSByZWZyZXNoRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy9AT3V0cHV0KCkgYWN0aW9uRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8R3JpZEFjdGlvbkVtaXRSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQWN0aW9uRW1pdFJlc3VsdD4oKTtcclxuXHJcbiAgQE91dHB1dCgpIHNhdmVEYXRhRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpIHJvd0NoYW5nZWRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRSb3dFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgYWRkZWRSb3dFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxSb3dBZGRlZFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0FkZGVkUmVzdWx0PigpXHJcblxyXG4gIEBPdXRwdXQoKSBmb2N1c091dEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBAT3V0cHV0KCkgY2VsbENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDZWxsQ2hhbmdlZFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDaGFuZ2VkUmVzdWx0PigpO1xyXG5cclxuICBAT3V0cHV0KCkgcm93RGVsZXRlZEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvY3VzT3V0Um93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvbkNvbnN1bHRDbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSByb3dEdXBsaWNhdGVkRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8Um93QWRkZWRSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dBZGRlZFJlc3VsdD4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgQFZpZXdDaGlsZChcImR0XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZHQ6IFRhYmxlIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKSBpZD86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2tzIHJvd3MgYnkgdGhlaXIgYnVzaW5lc3Mga2V5IChga2V5YCBpbnB1dCkgc28gUHJpbWVORyByZXVzZXMgZXhpc3Rpbmcgcm93IHZpZXdzXHJcbiAgICogaW5zdGVhZCBvZiBkZXN0cm95aW5nL3JlY3JlYXRpbmcgdGhlbSB3aGVuIHRoZSByb3cgYXJyYXkgaXMgcmVwbGFjZWQgd2l0aCBvYmplY3RzIHNoYXJpbmdcclxuICAgKiB0aGUgc2FtZSBrZXkgKGUuZy4gYWZ0ZXIgYSByZWNhbGN1bGF0aW9uIHRoYXQgY2xvbmVzIHRoZSBkYXRhKS4gV2l0aG91dCB0aGlzLCBldmVyeSBjZWxsXHJcbiAgICogZWRpdG9yIOKAlCBpbmNsdWRpbmcgc2VydmVyLWJhY2tlZCBzZWFyY2ggY29tYm9zIOKAlCBpcyByZS1pbnN0YW50aWF0ZWQgYW5kIHJlLWZldGNoZXMgaXRzIGRhdGEuXHJcbiAgICogRmFsbHMgYmFjayB0byB0aGUgcm93IGluZGV4IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQgKGUuZy4gYnJhbmQtbmV3IHJvd3MpLlxyXG4gICAqIEFycm93IHByb3BlcnR5IHNvIGB0aGlzYCBpcyBwcmVzZXJ2ZWQgd2hlbiBQcmltZU5HIGludm9rZXMgaXQuXHJcbiAgICovXHJcbiAgcm93VHJhY2tCeSA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBhbnkgPT4gaXRlbT8uW3RoaXMua2V5XSA/PyBpbmRleDtcclxuXHJcbiAgcHJpdmF0ZSBfZW50aXR5VmFsaWRhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KEVudGl0eVZhbGlkYXRpb25zU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBfc3RyaXBlZFJvd3NMYXlvdXRIZWxwZXJTZXJ2aWNlID0gaW5qZWN0KExheW91dEhlbHBlclNlcnZpY2UpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2NhbGl6ZVBpcGU6IExvY2FsaXplUGlwZSwgcHJpdmF0ZSBfZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuX3JlZ2lzdGVyR3JpZENvbnRhaW5zRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RyaXBlZFJvd3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RyaXBlZFJvd3NMYXlvdXRIZWxwZXJTZXJ2aWNlLmxheW91dENvbmZpZ3VyYXRpb24uaXNTdHJpcGVkUm93c0VuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KClcclxuICAgIHRoaXMuX2luaXRTYXZlRXZlbnRTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuX3ZlcmlmeUdyaWRSZXF1aXJlbWVudHMoKTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gICAgdGhpcy5faW5pdEVxdWF0YWJsZUZpZWxkcygpO1xyXG4gICAgdGhpcy5faW5pdFN1bUF0RnVzaW9uRmllbGRzKCk7XHJcbiAgICBcclxuICAgIGxldCBsYW5ndWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShydGxNb2RlS2V5cy5ydGxNb2RlRW5hYmxlZCk7XHJcbiAgICBcclxuICAgIGlmIChsYW5ndWUgJiYgSlNPTi5wYXJzZShsYW5ndWUpKSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IHRydWVcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQXIgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMgfHwgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl90ZW1wQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuICB9XHJcblxyXG4gIGZpbmRDb2x1bW5CeUtleShrZXk6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICBmb3IgKGxldCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbC5oZWFkZXIgPT09IGtleSB8fCBjb2wuZmllbGQgPT09IGtleSkgcmV0dXJuIGNvbDtcclxuICAgICAgICBlbHNlIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyByZXN0b3JlU3RhdGUoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICB0aGlzLl9yZXN0b3JlZENvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXIgPz8gdGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcjtcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgIHRoaXMuY29sdW1uV2lkdGguc2V0UmVtZW1iZXJlZChzdGF0ZS5jb2x1bW5XaWR0aHMpO1xyXG4gICAgICB0aGlzLmR0LmNvbHVtbldpZHRoc1N0YXRlID0gc3RhdGUuY29sdW1uV2lkdGhzO1xyXG4gICAgICB0aGlzLmR0LnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XHJcblxyXG4gICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcclxuXHJcbiAgICAgIGlmIChjb2x1bW5PcmRlcikge1xyXG4gICAgICAgIGxldCByZW9yZGVyZWRDb2x1bW5zID0gdGhpcy5nZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyKTtcclxuICAgICAgICBpZiAocmVvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBcHBseSB0aGUgcmVtZW1iZXJlZCBjb2x1bW4gd2lkdGhzIHRvIHRoZSBET00uIEFzc2lnbmluZyBjb2x1bW5XaWR0aHNTdGF0ZVxyXG4gICAgICAvLyBhbG9uZSBpcyBhIG5vLW9wIGhlcmUgYmVjYXVzZSB0aGUgZ3JpZCBpcyBub3QgUHJpbWVORy1cInN0YXRlZnVsXCIgKG5vIHN0YXRlS2V5KS5cclxuICAgICAgdGhpcy5kdC5yZXN0b3JlQ29sdW1uV2lkdGhzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyOiBzdHJpbmdbXSk6IGFueVtdIHtcclxuICAgIGxldCByZW9yZGVyZWRDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGNvbHVtbk9yZGVyLm1hcCgoa2V5KSA9PiB7XHJcbiAgICAgIGxldCBjb2wgPSB0aGlzLmZpbmRDb2x1bW5CeUtleShrZXkpO1xyXG4gICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgcmVvcmRlcmVkQ29sdW1ucy5wdXNoKGNvbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZW9yZGVyZWRDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICB0aGlzLl9yZXN0b3JlZENvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXIgPz8gdGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcjtcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgIHRoaXMuY29sdW1uV2lkdGgucmVzZXQoKTtcclxuICAgICAgdGhpcy5jb2x1bW5XaWR0aC5zZXRSZW1lbWJlcmVkKHN0YXRlLmNvbHVtbldpZHRocyk7XHJcbiAgICAgIHRoaXMuZHQuY29sdW1uV2lkdGhzU3RhdGUgPSBzdGF0ZS5jb2x1bW5XaWR0aHM7XHJcbiAgICAgIHRoaXMuZHQudGFibGVXaWR0aFN0YXRlID0gc3RhdGUudGFibGVXaWR0aDtcclxuXHJcbiAgICAgIGxldCBjb2x1bW5PcmRlciA9IHN0YXRlLmNvbHVtbk9yZGVyO1xyXG5cclxuICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XHJcbiAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXIpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwID8gcmVvcmRlcmVkQ29sdW1ucyA6IFsuLi50aGlzLl9jb2x1bW5zXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kdC5yZXN0b3JlQ29sdW1uV2lkdGhzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0ZSgpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5kdCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kdC5yZXNpemFibGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuZHQuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kdC5zYXZlQ29sdW1uT3JkZXIoc3RhdGUpO1xyXG5cclxuICAgIHJldHVybiBzdGF0ZVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hhcmVkIG1vZGVsIGZvciB0aGUgZGV2ZWxvcGVyLXdpZHRoIC8gd3JhcHBpbmcgLyByZXNpemUtcHJpb3JpdHkgYmVoYXZpb3IuIEFjdGlvbi9idXR0b25cclxuICAgKiBjb2x1bW5zIGFuZCBmcm96ZW4gY29sdW1ucyBhcmUgZXhjbHVkZWQgKGZyb3plbiBjb2x1bW5zIG11c3Qga2VlcCB0aGVpciBzdGlja3ktb2Zmc2V0XHJcbiAgICogd2lkdGggb3IgbGF0ZXIgZnJvemVuIGNvbHVtbnMgbWlzYWxpZ24pOyBhbGwgb3RoZXIgY29sdW1ucyBhcmUgZWxpZ2libGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2x1bW5XaWR0aCA9IG5ldyBDb2x1bW5XaWR0aENvbnRyb2xsZXIoKGNvbCkgPT4gIWNvbC5pc0J1dHRvbiAmJiAhY29sLmlzRnJvemVuKTtcclxuXHJcbiAgLyoqIFJlbWVtYmVyIHdoaWNoIGNvbHVtbiB0aGUgdXNlciByZXNpemVkIHNvIGl0cyBkZXZlbG9wZXItcHJlZmVycmVkIHdpZHRoIHlpZWxkcy4gKi9cclxuICBvbkNvbFJlc2l6ZShldmVudDogeyBlbGVtZW50PzogSFRNTEVsZW1lbnQ7IGRlbHRhPzogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgIHRoaXMuY29sdW1uV2lkdGgub25SZXNpemUoZXZlbnQ/LmVsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnZGF0YS1maWVsZCcpKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIGEgY29sdW1uJ3MgY29udGVudCBzaG91bGQgd3JhcCB0byBzdGF5IGluc2lkZSBpdHMgY29uc3RyYWluZWQgd2lkdGguICovXHJcbiAgc2hvdWxkV3JhcENvbHVtbihjb2w6IEdyaWRDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbldpZHRoLnNob3VsZFdyYXAoY29sKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldmVsb3BlciBzaXplIHN0eWxlIG9ubHksIGJvdW5kIHZpYSBgW25nU3R5bGVdYCBvbiB0aGUgaGVhZGVyL3N1bW1hcnkgY2VsbHMgYWxvbmdzaWRlXHJcbiAgICogdGhlaXIgdW50b3VjaGVkIGBbc3R5bGVdPVwiY29sLnN0eWxlXCJgIChzbyBhIHN0cmluZyBgY29sLnN0eWxlYCBpcyBuZXZlciBzcHJlYWQvYnJva2VuKS5cclxuICAgKi9cclxuICBnZXRDb2x1bW5TaXplU3R5bGUoY29sOiBHcmlkQ29sdW1uKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5XaWR0aC5zaXplU3R5bGUoY29sKTtcclxuICB9XHJcblxyXG4gIC8qKiBCb2R5IGA8dGQ+YCBzdHlsZTogUlRMIGFsaWdubWVudCArIHRvcC1hbGlnbiAoZWxpZ2libGUgY2VsbHMpICsgZGV2ZWxvcGVyIHNpemUgc3R5bGUuICovXHJcbiAgZ2V0Qm9keUNvbHVtblN0eWxlKGNvbDogR3JpZENvbHVtbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgY29uc3QgYmFzZSA9IHRoaXMuaXNBciA/IHsgJ3RleHQtYWxpZ24nOiAnc3RhcnQnIH0gOiB7fTtcclxuICAgIHJldHVybiB7IC4uLmJhc2UsIC4uLnRoaXMuY29sdW1uV2lkdGgudmVydGljYWxBbGlnbihjb2wpLCAuLi50aGlzLmNvbHVtbldpZHRoLnNpemVTdHlsZShjb2wpIH07XHJcbiAgfVxyXG5cclxuICBpc0RlbGV0ZUJ1dHRvbkRpc2FibGVkKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGVsZXRlTGluZUJ1dHRvbkRpc2FibGVkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWxldGVMaW5lQnV0dG9uRGlzYWJsZWQoaXRlbSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKVxyXG4gICAgdGhpcy5zYXZlRXZlbnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nRHVwbGljYXRlRW1pdCgpO1xyXG4gICAgdGhpcy5fY29sdW1uc0NoYW5nZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkNvbHVtbnNDaGFuZ2VkKGV2ZW50OiBDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50PEdyaWRDb2x1bW4+KTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uQWRkOiB7XHJcbiAgICAgICAgaWYgKGV2ZW50Lm5ld0l0ZW1zICYmIGV2ZW50Lm5ld1N0YXJ0aW5nSW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgZXZlbnQubmV3SXRlbXMuZm9yRWFjaChjb2wgPT5cclxuICAgICAgICAgICAgY29sLnRyYW5zbGF0ZWRIZWFkZXIgPSB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKGNvbC5oZWFkZXIgPz8gXCJcIilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjb25zdCBwcmV2U2VsZWN0ZWQgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRDb2x1bW5zKTtcclxuICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBbLi4udGhpcy5fY29sdW1uc107XHJcbiAgICAgICAgICBuZXdDb2x1bW5zLnNwbGljZShldmVudC5uZXdTdGFydGluZ0luZGV4LCAwLCAuLi5ldmVudC5uZXdJdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gbmV3Q29sdW1ucztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgICAgICAgIGMgPT4gcHJldlNlbGVjdGVkLmhhcyhjKSB8fCBldmVudC5uZXdJdGVtcyEuaW5jbHVkZXMoYylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLl9yZWFwcGx5UmVzdG9yZWRDb2x1bW5PcmRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uUmVtb3ZlOiB7XHJcbiAgICAgICAgaWYgKGV2ZW50Lm9sZEl0ZW1zKSB7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVkID0gbmV3IFNldChldmVudC5vbGRJdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoYyA9PiAhcmVtb3ZlZC5oYXMoYykpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoYyA9PiAhcmVtb3ZlZC5oYXMoYykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uUmVwbGFjZToge1xyXG4gICAgICAgIGlmIChldmVudC5uZXdJdGVtcyAmJiBldmVudC5vbGRJdGVtcyAmJiBldmVudC5uZXdTdGFydGluZ0luZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGV2ZW50Lm5ld0l0ZW1zLmZvckVhY2goY29sID0+XHJcbiAgICAgICAgICAgIGNvbC50cmFuc2xhdGVkSGVhZGVyID0gdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybShjb2wuaGVhZGVyID8/IFwiXCIpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc3QgcHJldlNlbGVjdGVkID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkQ29sdW1ucyk7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVkT2xkID0gbmV3IFNldChldmVudC5vbGRJdGVtcyk7XHJcbiAgICAgICAgICBjb25zdCBuZXdDb2x1bW5zID0gWy4uLnRoaXMuX2NvbHVtbnNdO1xyXG4gICAgICAgICAgbmV3Q29sdW1ucy5zcGxpY2UoZXZlbnQubmV3U3RhcnRpbmdJbmRleCwgZXZlbnQub2xkSXRlbXMubGVuZ3RoLCAuLi5ldmVudC5uZXdJdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gbmV3Q29sdW1ucztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgICAgICAgIGMgPT4gKHByZXZTZWxlY3RlZC5oYXMoYykgJiYgIXJlbW92ZWRPbGQuaGFzKGMpKSB8fCBldmVudC5uZXdJdGVtcyEuaW5jbHVkZXMoYylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLl9yZWFwcGx5UmVzdG9yZWRDb2x1bW5PcmRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uUmVzZXQ6XHJcbiAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zID0gW107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBbXTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3ZlcmlmeUdyaWRSZXF1aXJlbWVudHMoKTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmUtYXBwbGllcyB0aGUgc2F2ZWQgcHJlc2VudGF0aW9uIGFmdGVyIHRoZSBjb2x1bW5zIGNoYW5nZWQsIHNvIG9ubHkgdGhlIHNhdmVkIGNvbHVtbnMgcmVuZGVyLFxyXG4gICAqIGluIHRoZSBzYXZlZCBvcmRlci4gTm8tb3AgdW50aWwgYSBsYXlvdXQgaXMgcmVzdG9yZWQsIG9yIHdoaWxlIG5vbmUgb2YgaXRzIGtleXMgcmVzb2x2ZSB5ZXRcclxuICAgKiAoa2VlcHMgdGhlIGRlZmF1bHQgXCJhbGwgY29sdW1uc1wiIGluc3RlYWQgb2YgYW4gZW1wdHkgZ3JpZCkuIFdpZHRocyBuZWVkIG5vIHJlLWFwcGx5OiB0aGVcclxuICAgKiBwb3NpdGlvbmFsIHN0eWxlIFByaW1lTkcgd3JvdGUgaW4gcmVzdG9yZVN0YXRlIG1hdGNoZXMgYWdhaW4gb25jZSB0aGUgc2F2ZWQgb3JkZXIgaXMgYmFjay5cclxuICAgKi9cclxuICBwcml2YXRlIF9yZWFwcGx5UmVzdG9yZWRDb2x1bW5PcmRlcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnModGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcik7XHJcbiAgICBpZiAocmVvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVJdGVtcygpIHtcclxuICAgIGNvbnN0IGNsZWFuID0gdGhpcy5fY2xlYW5HcmlkRGF0YUZvckVtaXQoKTtcclxuICAgIHRoaXMuc2F2ZURhdGFFdmVudEVtaXR0ZXIuZW1pdChjbGVhbik7XHJcbiAgfVxyXG5cclxuICBhZGRSb3coKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZERhdGEpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xyXG4gICAgfVxyXG4gICAgbGV0IG5ld1JvdyA9IHRoaXMuX2luaXRSb3coKVxyXG4gICAgdGhpcy5ncmlkRGF0YS5wdXNoKG5ld1JvdylcclxuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWVcclxuICAgIGxldCByb3dBZGRlZFJlc3VsdDogUm93QWRkZWRSZXN1bHQgPSB7XHJcbiAgICAgIHJvd051bWJlcjogdGhpcy5ncmlkRGF0YS5sZW5ndGggLSAxLFxyXG4gICAgICBkYXRhOiBuZXdSb3dcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5lZGl0YWJsZVRhYmxlPy5zb3J0RmllbGQgJiYgdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRPcmRlcikge1xyXG4gICAgICB0aGlzLmVkaXRhYmxlVGFibGU/LnZhbHVlLnB1c2gobmV3Um93KVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoU29ydCgpXHJcbiAgICB0aGlzLmFkZGVkUm93RXZlbnRFbWl0dGVyLmVtaXQocm93QWRkZWRSZXN1bHQpXHJcbiAgfVxyXG5cclxuICBkdXBsaWNhdGVSb3coaXRlbTogYW55LCB1cGRhdGVTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlLCBza2lwRW1pdDogYm9vbGVhbiA9IGZhbHNlKTogUm93QWRkZWRSZXN1bHQgfCBudWxsIHtcclxuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgZHVwbGljYXRlZFJvdyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xyXG4gICAgZHVwbGljYXRlZFJvd1t0aGlzLmVudGl0eVByaW1hcnlLZXlOYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgIGlmIChjb2wuZXhjbHVkZU9uRHVwbGljYXRlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkdXBsaWNhdGVkUm93LCBjb2wuZmllbGQpKSB7XHJcbiAgICAgICAgZHVwbGljYXRlZFJvd1tjb2wuZmllbGRdID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzQXV0b1Jvd051bWJlcikge1xyXG4gICAgICBkdXBsaWNhdGVkUm93W3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF0gPSB0aGlzLl9uZXh0Um93TnVtYmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkICYmIHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0T3JkZXIpIHtcclxuICAgICAgY29uc3QgdGFibGVJbmRleCA9IHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgICBpZiAodGFibGVJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZVRhYmxlLnZhbHVlLnNwbGljZSh0YWJsZUluZGV4ICsgMSwgMCwgZHVwbGljYXRlZFJvdyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZVRhYmxlLnZhbHVlLnB1c2goZHVwbGljYXRlZFJvdyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhSW5kZXggPSB0aGlzLmdyaWREYXRhLmluZGV4T2YoaXRlbSwgMCk7XHJcbiAgICBpZiAoZGF0YUluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YS5zcGxpY2UoZGF0YUluZGV4ICsgMSwgMCwgZHVwbGljYXRlZFJvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWREYXRhLnB1c2goZHVwbGljYXRlZFJvdyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMucmVmcmVzaFNvcnQoKTtcclxuXHJcbiAgICBpZiAodXBkYXRlU2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZHVwbGljYXRlZFJvdztcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlXHJcbiAgICAgICAgPyBbZHVwbGljYXRlZFJvd11cclxuICAgICAgICA6IGR1cGxpY2F0ZWRSb3c7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0OiBSb3dBZGRlZFJlc3VsdCA9IHtcclxuICAgICAgcm93TnVtYmVyOiB0aGlzLmdyaWREYXRhLmluZGV4T2YoZHVwbGljYXRlZFJvdyksXHJcbiAgICAgIGRhdGE6IGR1cGxpY2F0ZWRSb3dcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCFza2lwRW1pdCkge1xyXG4gICAgICB0aGlzLmFkZGVkUm93RXZlbnRFbWl0dGVyLmVtaXQocmVzdWx0KTtcclxuICAgICAgdGhpcy5yb3dEdXBsaWNhdGVkRXZlbnRFbWl0dGVyLmVtaXQocmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaFNvcnQoKSB7XHJcbiAgICBpZiAodGhpcy5lZGl0YWJsZVRhYmxlPy5zb3J0RmllbGQpIHtcclxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRGaWVsZDtcclxuICAgICAgY29uc3Qgc29ydE9yZGVyID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRPcmRlcjtcclxuXHJcbiAgICAgIHRoaXMuZ3JpZERhdGEuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQSA9IGFbc29ydEZpZWxkXTtcclxuICAgICAgICBjb25zdCB2YWx1ZUIgPSBiW3NvcnRGaWVsZF07XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmVzdWx0ID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAqIHNvcnRPcmRlcjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmdyaWREYXRhID0gWy4uLnRoaXMuZ3JpZERhdGFdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGVsZXRlKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkICYmIHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0TW9kZSkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkRGF0YS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLmlzRGlydHkgPSB0cnVlXHJcbiAgICAgIHRoaXMuX29uRGVsZXRlUm93KGl0ZW0pO1xyXG4gICAgICB0aGlzLnJvd0RlbGV0ZWRFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLl9jbGVhbkdyaWREYXRhRm9yRW1pdCgpKVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoU29ydCgpXHJcbiAgfVxyXG5cclxuICBnZXRTdW1tYXJ5KGNvbDogR3JpZENvbHVtbik6IG51bWJlciB7XHJcbiAgICBpZiAoY29sLmhhdmVTdW1tYXJ5ID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIHByZWNpc2VTdW0oKHRoaXMuZ3JpZERhdGEgPz8gW10pLm1hcCgocm93OiBhbnkpID0+IHJvd1tjb2wuZmllbGRdKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIHJvd1N1bW1hcnkocm93OiBhbnkpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHByZWNpc2VTdW0odGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnJvd1N1bW1hcnkgPT0gdHJ1ZSkubWFwKGNvbCA9PiByb3dbY29sLmZpZWxkXSkpO1xyXG4gIH1cclxuXHJcbiAgb25Sb3dTZWxlY3RlZChldmVudDogVGFibGVSb3dTZWxlY3RFdmVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy5fZjZTb3VyY2VSb3cgPSBudWxsO1xyXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ0R1cGxpY2F0ZUVtaXQoKTtcclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkgPT0gdHJ1ZSkge1xyXG4gICAgICBsZXQgc2VsZWN0aW9uS2V5OiBhbnk7XHJcbiAgICAgIHNlbGVjdGlvbktleSA9IHRoaXMuc2VsZWN0ZWRJdGVtW3RoaXMua2V5XTtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHNlbGVjdGlvbktleSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJvd1Vuc2VsZWN0KGV2ZW50OiBUYWJsZVJvd1VuU2VsZWN0RXZlbnQpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fZjZTb3VyY2VSb3cgPSBudWxsO1xyXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ0R1cGxpY2F0ZUVtaXQoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZShldmVudDogYW55KSB7XHJcblxyXG4gICAgbGV0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgICAgICBsZXQga2V5czogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZvckVhY2goKHY6IGFueSkgPT4geyBrZXlzLnB1c2godlt0aGlzLmtleV0pIH0pO1xyXG4gICAgICAgICAgc2VsZWN0aW9uID0ga2V5cztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkSXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkSXRlbXMgPyBbdGhpcy5zZWxlY3RlZEl0ZW1zW3RoaXMua2V5XV0gOiBbXTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkSXRlbXMgPyBbdGhpcy5zZWxlY3RlZEl0ZW1zXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPSBHcmlkU2VsZWN0aW9uTW9kZS5Ob25lKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHNlbGVjdGlvbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5jb2RlID09PSAnU3BhY2UnKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdGNicpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX2Y2U291cmNlUm93ID8/IHRoaXMuc2VsZWN0ZWRJdGVtO1xyXG4gICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgaXNGaXJzdER1cGxpY2F0ZSA9ICF0aGlzLl9mNlNvdXJjZVJvdztcclxuICAgICAgdGhpcy5fZjZTb3VyY2VSb3cgPSBzb3VyY2U7XHJcblxyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmR1cGxpY2F0ZVJvdyhzb3VyY2UsIGlzRmlyc3REdXBsaWNhdGUsIHRydWUpO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdCAmJiAhdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVSZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVFbWl0VGltZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZUVtaXRUaW1lciA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVSZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMuYWRkZWRSb3dFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLl9wZW5kaW5nRHVwbGljYXRlUmVzdWx0KTtcclxuICAgICAgICAgIHRoaXMucm93RHVwbGljYXRlZEV2ZW50RW1pdHRlci5lbWl0KHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVSZXN1bHQpO1xyXG4gICAgICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAzMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Gb2N1c091dFJvdyhpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZm9jdXNPdXRSb3cuZW1pdChpdGVtKTtcclxuICB9XHJcblxyXG4gIGN1c3RvbVNvcnQoZXZlbnQ6IFNvcnRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCAmJiBldmVudC5kYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBldmVudC5kYXRhLnNvcnQoKGRhdGExLCBkYXRhMikgPT4ge1xyXG4gICAgICAgIGlmIChldmVudC5maWVsZCAhPSBudWxsICYmIGV2ZW50LmZpZWxkICE9IHVuZGVmaW5lZCAmJiBldmVudC5vcmRlcikge1xyXG4gICAgICAgICAgbGV0IHZhbHVlMSA9IGRhdGExW2V2ZW50LmZpZWxkXTtcclxuICAgICAgICAgIGxldCB2YWx1ZTIgPSBkYXRhMltldmVudC5maWVsZF07XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgcmVzdWx0ID0gMDtcclxuICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTEubG9jYWxlQ29tcGFyZSh2YWx1ZTIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXN1bHQgPSAodmFsdWUxIDwgdmFsdWUyKSA/IC0xIDogKHZhbHVlMSA+IHZhbHVlMikgPyAxIDogMDtcclxuXHJcbiAgICAgICAgICByZXR1cm4gKGV2ZW50Lm9yZGVyICogcmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3VsdChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNvbnN1bHRDbGlja2VkLmVtaXQoa2V5KTtcclxuICB9XHJcblxyXG4gIG9uQ2VsbExhYmVsUmVzb2x2ZWQoY29sOiBHcmlkQ29sdW1uLCBsYWJlbDogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGl0ZW1bdGhpcy5fZ2V0U2hhZG93U2VhcmNoQ29sdW1uTGFiZWwoY29sKV0gPSBsYWJlbDtcclxuICB9XHJcblxyXG4gIG9uQ2VsbFZhbHVlQ2hhbmdlZChjb2w6IEdyaWRDb2x1bW4sIG5ld1ZhbHVlOiBhbnksIGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgLy8gTWFyayB0aGUgZ3JpZCBpdHNlbGYgZGlydHkgb24gYW55IGdlbnVpbmUgY2VsbCBlZGl0LiBUaGUgZ3JpZCBpbnN0YW5jZSBsaXZlc1xyXG4gICAgLy8gZm9yIHRoZSB3aG9sZSBmb3JtIGxpZmV0aW1lLCBzbyB0aGlzIGZsYWcgc3Vydml2ZXMgcm93LWRhdGEgcmVhc3NpZ25tZW50XHJcbiAgICAvLyBkdXJpbmcgcmVjYWxjdWxhdGlvbiAod2hlcmUgdHJhbnNpZW50IGNlbGwgaW5wdXRzIGFyZSByZWNyZWF0ZWQgYW5kIGxvc2VcclxuICAgIC8vIHRoZWlyIG93biBpc0RpcnR5KSwga2VlcGluZyB0aGUgc2F2ZS10aW1lIGNoYW5nZSBkZXRlY3Rpb24gYWNjdXJhdGUuXHJcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xyXG4gICAgaWYgKGNvbC50eXBlID09PSBJbnB1dFR5cGVzLlNFQVJDSF9DT01CTyAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIGRlbGV0ZSBpdGVtW3RoaXMuX2dldFNoYWRvd1NlYXJjaENvbHVtbkxhYmVsKGNvbCldO1xyXG4gICAgfVxyXG4gICAgLy8gc2VuZCBldmVudHNcclxuICAgIGlmIChjb2wud2F0Y2hGb3JDaGFuZ2VzID09PSB0cnVlKSB7XHJcblxyXG4gICAgICBsZXQgY2VsbENoYW5nZWRSZXN1bHQ6IENlbGxDaGFuZ2VkUmVzdWx0ID0ge1xyXG4gICAgICAgIGtleTogaXRlbVt0aGlzLmtleV0sXHJcbiAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNlbGxDaGFuZ2VkLmVtaXQoY2VsbENoYW5nZWRSZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlY2FsY3VsYXRlIGN1cnJlbnRSb3dOdW1iZXJcclxuICAgIGlmIChjb2wuZmllbGQgPT09IHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCkge1xyXG4gICAgICB0aGlzLl9vcmRlckJ5Um93TnVtYmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZWQgcm93c1xyXG4gICAgLy8gaWYodGhpcy5fZXF1YWxpdHlDaGVja09uICYmIGNvbC5pc0VxdWF0YWJsZUNyaXRlcmlhKXtcclxuICAgIC8vICAgY29uc29sZS5sb2coJ2ZvdW5kIGVxdWF0YWJsZSA6IGNvbDonLCBjb2wsICdyb3cgOiAnLCBpdGVtKTtcclxuICAgIC8vICAgdGhpcy5fdHJ5RmluZEVxdWF0YWJsZShpdGVtKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlOiBGb3JtU3RhdGUpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZS51cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlKTtcclxuICB9XHJcblxyXG4gIGFwcGx5R2xvYmFsU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kdD8uZmlsdGVyR2xvYmFsKHRoaXMuc2VhcmNoVmFsdWUsIEVkaXRhYmxlR3JpZENvbXBvbmVudC5ERUNJTUFMX0FXQVJFX0NPTlRBSU5TX0ZJTFRFUik7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcblxyXG4gIHByaXZhdGUgX2luaXRSb3coKSB7XHJcbiAgICBsZXQgbmV3Um93OiBhbnkgPSB7fTtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUXHJcbiAgICAgICAgICB8fCBjb2wudHlwZSA9PSBJbnB1dFR5cGVzLlJBVEVfSU5QVVRcclxuICAgICAgICAgIHx8IGNvbC50eXBlID09IElucHV0VHlwZXMuSU5URUdFUlxyXG4gICAgICAgICAgfHwgY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUXHJcbiAgICAgICAgICB8fCBjb2wudHlwZSA9PSBJbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUKSB7XHJcbiAgICAgICAgICBuZXdSb3dbY29sLmZpZWxkXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbC50eXBlID09IElucHV0VHlwZXMuQ0hFQ0tCT1gpIHtcclxuICAgICAgICAgIG5ld1Jvd1tjb2wuZmllbGRdID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbmV3Um93W2NvbC5maWVsZF0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pc0F1dG9Sb3dOdW1iZXIgPT09IHRydWUpIHtcclxuICAgICAgICBuZXdSb3dbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXSA9IHRoaXMuX25leHRSb3dOdW1iZXIoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3Um93XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3Um93O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFNhdmVFdmVudFN1YnNjcmlwdGlvbigpIHtcclxuICAgIHRoaXMuc2F2ZUV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5zYXZlRXZlbnQ/LnN1YnNjcmliZShcclxuICAgICAgKCkgPT4gdGhpcy5zYXZlSXRlbXMoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZlcmlmeUdyaWRSZXF1aXJlbWVudHMoKSB7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zID09IG51bGxcclxuICAgICAgfHwgdGhpcy5jb2x1bW5zID09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyaWQgY29sdW1ucyBjYW5cXCd0IGJlIG51bGwnKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBsZXQgcm93TnVtYmVyQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzQXV0b1Jvd051bWJlckNvbHVtbiA9PT0gdHJ1ZSk7XHJcblxyXG4gICAgaWYgKHJvd051bWJlckNvbHVtbnMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyaWQgY29sdW1ucyBjYW5cXCd0IGhhdmUgbW9yZSB0aGFuIG9uZSBSb3dOdW1iZXJDb2x1bW4nKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAocm93TnVtYmVyQ29sdW1ucy5sZW5ndGggPT0gMSkge1xyXG4gICAgICB0aGlzLl9pc0F1dG9Sb3dOdW1iZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9hdXRvUm93TnVtYmVyRmllbGQgPSByb3dOdW1iZXJDb2x1bW5zWzBdLmZpZWxkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdEN1cnJlbnRSb3dOdW1iZXJBbmRPcmRlckJ5Um93TnVtYmVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzQXV0b1Jvd051bWJlciA9PT0gdHJ1ZVxyXG4gICAgICAmJiB0aGlzLl9hdXRvUm93TnVtYmVyRmllbGQgIT0gdW5kZWZpbmVkXHJcbiAgICAgICYmIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCAhPSBudWxsXHJcbiAgICAgICYmIHRoaXMuZ3JpZERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9vcmRlckJ5Um93TnVtYmVyKCk7XHJcblxyXG4gICAgICB0aGlzLl9jdXJyZW50Um93TnVtYmVyID0gdGhpcy5ncmlkRGF0YVt0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDFdW3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9uZXh0Um93TnVtYmVyKCk6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jdXJyZW50Um93TnVtYmVyID0gdGhpcy5ncmlkRGF0YS5sZW5ndGggKyAxO1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkRlbGV0ZVJvdyhyb3c6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHJvd1t0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdID09PSB0aGlzLl9jdXJyZW50Um93TnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXItLTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29yZGVyQnlSb3dOdW1iZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWREYXRhLnNvcnQoKGEsIGIpID0+IHsgcmV0dXJuIGFbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXSAtIGJbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXTsgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RXF1YXRhYmxlRmllbGRzKCk6IHZvaWQge1xyXG4gICAgbGV0IGVxdWF0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc0VxdWF0YWJsZUNyaXRlcmlhID09IHRydWUpO1xyXG4gICAgaWYgKGVxdWF0YWJsZUNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5fZXF1YWxpdHlDaGVja09uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fZXF1YXRhYmxlRmllbGRzID0gZXF1YXRhYmxlQ29sdW1ucy5tYXAoYyA9PiBjLmZpZWxkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRTdW1BdEZ1c2lvbkZpZWxkcygpOiB2b2lkIHtcclxuICAgIGxldCBzdW1BdEZ1c2lvbkNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc1N1bUF0RnVzaW9uID09IHRydWUpO1xyXG4gICAgaWYgKHN1bUF0RnVzaW9uQ29sdW1ucykge1xyXG4gICAgICB0aGlzLl9lcXVhbGl0eUNoZWNrT24gPSB0cnVlO1xyXG4gICAgICB0aGlzLl9zdW1BdEZ1c2lvbkZpZWxkcyA9IHN1bUF0RnVzaW9uQ29sdW1ucy5tYXAoYyA9PiBjLmZpZWxkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RyeUZpbmRFcXVhdGFibGUocm93OiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBmb3VuZEVxdWFsUm93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5ncmlkRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zb2xlLmxvZygncHJvYyByb3cgOiAnLCB0aGlzLmdyaWREYXRhW2ldKTtcclxuICAgICAgbGV0IGlzQ3VycmVudFJvd0VxdWFsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fZXF1YXRhYmxlRmllbGRzPy5mb3JFYWNoKGYgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdwcm9jIGZpZWxkIDogJywgZik7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZERhdGFbaV1bZl0gIT0gcm93W2ZdKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnbm90IGVxdWFsICcsIHJvdywgdGhpcy5ncmlkRGF0YVtpXSk7XHJcbiAgICAgICAgICBpc0N1cnJlbnRSb3dFcXVhbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpc0N1cnJlbnRSb3dFcXVhbCkge1xyXG4gICAgICAgIHRoaXMuX2Z1c2lvblJvd3ModGhpcy5ncmlkRGF0YVtpXSwgcm93KTtcclxuICAgICAgICBmb3VuZEVxdWFsUm93ID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGZvdW5kRXF1YWxSb3cpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2RlbGV0aW5nIDogJywgcm93KTtcclxuICAgICAgdGhpcy5kZWxldGUocm93KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Z1c2lvblJvd3Mocm93MTogYW55LCByb3cyOiBhbnkpIHtcclxuICAgIHRoaXMuX3N1bUF0RnVzaW9uRmllbGRzPy5mb3JFYWNoKGYgPT4ge1xyXG4gICAgICByb3cxW2ZdID0gcHJlY2lzZUFkZChyb3cxW2ZdLCByb3cyW2ZdKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuY2VsUGVuZGluZ0R1cGxpY2F0ZUVtaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wZW5kaW5nRHVwbGljYXRlUmVzdWx0ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKTtcclxuICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZUVtaXRUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zeW5jR2xvYmFsRmlsdGVyRmllbGRzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5zZWxlY3RlZENvbHVtbnMpIHtcclxuICAgICAgaWYgKGNvbC50eXBlID09PSBJbnB1dFR5cGVzLlNFQVJDSF9DT01CTykge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKHRoaXMuX2dldFNoYWRvd1NlYXJjaENvbHVtbkxhYmVsKGNvbCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzID0gZmllbGRzO1xyXG4gIH1cclxuICBcclxuICBwcml2YXRlIF9yZWdpc3RlckdyaWRDb250YWluc0ZpbHRlcigpOiB2b2lkIHtcclxuICAgIC8vIEN1c3RvbSBQcmltZU5HIGZpbHRlciB1c2VkIGJ5IGFwcGx5R2xvYmFsU2VhcmNoKCkgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gJ2NvbnRhaW5zJy5cclxuICAgIC8vIEV4dGVuZHMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHdpdGggbG9jYWxlLWF3YXJlIGRlY2ltYWwgbWF0Y2hpbmc6XHJcbiAgICAvLyBhIHVzZXIgaW4gRlIvQVIgbG9jYWxlIHR5cGVzIFwiMTEsMjVcIiBidXQgdGhlIHN0b3JlZCBKUyBudW1iZXIgc3RyaW5naWZpZXMgYXMgXCIxMS4yNVwiLFxyXG4gICAgLy8gc28gYSBwbGFpbiAnY29udGFpbnMnIGNoZWNrIHdvdWxkIG1pc3MgaXQuXHJcbiAgICB0aGlzLl9maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKEVkaXRhYmxlR3JpZENvbXBvbmVudC5ERUNJTUFMX0FXQVJFX0NPTlRBSU5TX0ZJTFRFUiwgKHZhbHVlOiBhbnksIGZpbHRlcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIudHJpbSgpID09PSAnJykgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3Qgc3RyRmlsdGVyID0gZmlsdGVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgLy8gU3RlcCAxIOKAlCBkaXJlY3QgbWF0Y2ggKGhhbmRsZXMgYWxsIHRleHQgY29sdW1ucyBhbmQgZXhhY3QgbnVtZXJpYyBtYXRjaGVzKVxyXG4gICAgICBpZiAoc3RyVmFsdWUuaW5jbHVkZXMoc3RyRmlsdGVyKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAvLyBTdGVwIDIg4oCUIGRlY2ltYWwgY29tbWHihpRkb3Qgbm9ybWFsaXphdGlvbi5cclxuICAgICAgLy8gVHdvIGd1YXJkcyBtdXN0IGJvdGggcGFzcyBiZWZvcmUgbm9ybWFsaXppbmc6XHJcbiAgICAgIC8vICAg4oCiIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgIOKGkiBvbmx5IHJ1biBvbiBhY3R1YWwgbnVtZXJpYyB2YWx1ZXM7IHRleHQgY29sdW1uc1xyXG4gICAgICAvLyAgICAgY29udGFpbmluZyBkb3RzIChlLmcuIHByb2R1Y3QgY29kZXMgbGlrZSBcIkhQLlhZWlwiKSBhcmUgbmV2ZXIgdG91Y2hlZC5cclxuICAgICAgLy8gICDigKIgL15cXGQrWywuXVxcZCskLyAgICAgICAgICAgIOKGkiBmaWx0ZXIgbXVzdCBsb29rIGxpa2UgYSBkZWNpbWFsIG51bWJlcjpcclxuICAgICAgLy8gICAgICAgXlxcZCsgICBvbmUgb3IgbW9yZSBkaWdpdHMgYmVmb3JlIHRoZSBzZXBhcmF0b3JcclxuICAgICAgLy8gICAgICAgWywuXSAgIGV4YWN0bHkgb25lIHNlcGFyYXRvciwgY29tbWEgb3IgZG90XHJcbiAgICAgIC8vICAgICAgIFxcZCskICAgb25lIG9yIG1vcmUgZGlnaXRzIGFmdGVyIHRoZSBzZXBhcmF0b3JcclxuICAgICAgLy8gICAgIFRoaXMgcmVqZWN0cyBmcmVlLXRleHQgZmlsdGVycyB0aGF0IGhhcHBlbiB0byBjb250YWluIGEgY29tbWEgKFwiQ2Fpc3NlLCBGcmFuY2VcIilcclxuICAgICAgLy8gICAgIGFuZCBpbmNvbXBsZXRlIGlucHV0cyAoXCIxMSxcIiAvIFwiLDI1XCIpLlxyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAvXlxcZCtbLC5dXFxkKyQvLnRlc3Qoc3RyRmlsdGVyKSkge1xyXG4gICAgICAgIHJldHVybiBzdHJWYWx1ZS5pbmNsdWRlcyhzdHJGaWx0ZXIucmVwbGFjZSgnLCcsICcuJykpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFuR3JpZERhdGFGb3JFbWl0KCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhLm1hcChyb3cgPT4ge1xyXG4gICAgICBjb25zdCBjbGVhbjogYW55ID0ge307XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdykpIHtcclxuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKEVkaXRhYmxlR3JpZENvbXBvbmVudC5TRUFSQ0hfTEFCRUxfUFJFRklYKSkge1xyXG4gICAgICAgICAgY2xlYW5ba2V5XSA9IHJvd1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY2xlYW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFNoYWRvd1NlYXJjaENvbHVtbkxhYmVsKGNvbHVtbjogR3JpZENvbHVtbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7RWRpdGFibGVHcmlkQ29tcG9uZW50LlNFQVJDSF9MQUJFTF9QUkVGSVh9JHtjb2x1bW4uZmllbGR9YDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICA8cC10YWJsZSAjZHQgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCIgZWRpdE1vZGU9XCJyb3dcIlxyXG4gICAgW3BhZ2luYXRvcl09XCJncmlkRGF0YS5sZW5ndGggPiBwYWdlU2l6ZVwiIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicm93UGVyUGFnZVwiIFtyb3dzXT1cInBhZ2VTaXplXCJcclxuICAgIChvblJvd1NlbGVjdCk9XCJvblJvd1NlbGVjdGVkKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJvblJvd1Vuc2VsZWN0KCRldmVudClcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgIChvbkNvbFJlc2l6ZSk9XCJvbkNvbFJlc2l6ZSgkZXZlbnQpXCJcclxuICAgIFtyZXNpemFibGVDb2x1bW5zXT1cInRydWVcIiBjb2x1bW5SZXNpemVNb2RlPVwiZXhwYW5kXCIgYXBwZW5kVG89XCJib2R5XCIgW3ZhbHVlXT1cImdyaWREYXRhXCJcclxuICAgIFtjb2x1bW5zXT1cInNlbGVjdGVkQ29sdW1uc1wiIFtkYXRhS2V5XT1cImtleVwiIFtzY3JvbGxIZWlnaHRdPVwic2Nyb2xsSGVpZ2h0XCIgW3N0eWxlQ2xhc3NdPVwiJ3AtZGF0YXRhYmxlLXNtIHAtZGF0YXRhYmxlLWdyaWRsaW5lcycgKyAoc3RyaXBlZFJvd3MgPyAnIHAtZGF0YXRhYmxlLXN0cmlwZWQnIDogJycpXCJcclxuICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIiAjZWRpdGFibGVUYWJsZSBbdG90YWxSZWNvcmRzXT1cImdyaWREYXRhLmxlbmd0aFwiXHJcbiAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlckZpZWxkc1wiIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnlcIiBbdGFibGVTdHlsZV09XCJ0YWJsZVN0eWxlXCI+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC01IGZsZXgtcm93XCI+XHJcbiAgICAgICAgPHAtbXVsdGlTZWxlY3QgW29wdGlvbnNdPVwiY29sdW1uc1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW5zXCJcclxuICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSB7eyAnY29sdW1uc19zZWxlY3RlZCcgfCBsb2NhbGl6ZSB9fVwiIG9wdGlvbkxhYmVsPVwidHJhbnNsYXRlZEhlYWRlclwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieydtaW4td2lkdGgnOiAnMTgwcHgnfVwiIHBsYWNlaG9sZGVyPVwie3sgJ2Nob29zZV9jb2x1bW5zJyB8IGxvY2FsaXplIH19XCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LW9wdGlvbiBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IG9wdGlvbi5oZWFkZXIgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHbG9iYWxTZWFyY2hcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHctOFwiPlxyXG4gICAgICAgICAgPGRpdiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJnbG9iYWxfc2VhcmNoXCIgY2xhc3M9XCJwLWlucHV0Z3JvdXAgcnRsLW1vZGUgaC0ycmVtIG5vLXBhZFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJcIiB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIiBwSW5wdXRUZXh0IGNsYXNzPVwiYm9yZGVyLXJvdW5kLWxnXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ3NoYXJlZF9lZGl0dGFibGVfc2VhcmNoX3BsYWNlaG9sZGVyJyB8IGxvY2FsaXplXCIgKGtleWRvd24uZW50ZXIpPVwiYXBwbHlHbG9iYWxTZWFyY2goKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cInNlYXJjaF9idXR0b25cIj5cclxuICAgICAgICAgICAgPFRzaS1CdXR0b24gc3R5bGVDbGFzcz1cInAtYnV0dG9uLWljb24tb25seVwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfc2VhcmNoXCJcclxuICAgICAgICAgICAgICAob25DbGljayk9XCJhcHBseUdsb2JhbFNlYXJjaCgpXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj4gXHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuXHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uTW9kZSAhPSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uIHN0eWxlPVwibWluLXdpZHRoOjJyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6MnJlbSAhaW1wb3J0YW50O1wiPjwvdGg+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6MnJlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDoycmVtICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIFxyXG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGg+XHJcblxyXG4gICAgICAgIDwhLS0gPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD4gLS0+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEdXBsaWNhdGVCdXR0b25cIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93Q29uc3VsdEJ1dHRvblwiIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGg+XHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG5cclxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiY29sLmlzRnJvemVuXCIgW3N0eWxlXT1cImNvbC5zdHlsZVwiIFtuZ1N0eWxlXT1cImdldENvbHVtblNpemVTdHlsZShjb2wpXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgW2F0dHIuZGF0YS1maWVsZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgW2NsYXNzLnRzaS1jb2wtd3JhcF09XCJzaG91bGRXcmFwQ29sdW1uKGNvbClcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTtcIiBwU29ydGFibGVDb2x1bW49XCJ7e2NvbC5maWVsZH19XCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgIHBUb29sdGlwPVwie3tjb2wudG9vbFRpcFRleHQgfCBsb2NhbGl6ZSB9fVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHBSZW9yZGVyYWJsZUNvbHVtbj57eyBjb2wuaGVhZGVyIHwgbG9jYWxpemVcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInt7Y29sLmZpZWxkfX1cIj48L3Atc29ydEljb24+XHJcbiAgICAgICAgICA8VHNpLUJ1YmJsZS1JbmZvIFtpbmZvVGV4dF09XCJjb2wuaW5mb1RleHQgfCBsb2NhbGl6ZVwiPjwvVHNpLUJ1YmJsZS1JbmZvPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoIHN0eWxlPVwibWluLXdpZHRoOjNyZW1cIiAqbmdJZj1cInNob3dSb3dTdW1tYXJ5XCIgc2NvcGU9XCJjb2xcIj57eydSb3dTdW1tYXJ5JyB8IGxvY2FsaXplfX08L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1pdGVtIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgIFxyXG4gICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJpdGVtXCJcclxuICAgICAgICAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09IHVuZGVmaW5lZDsgZWxzZSBzZWxlY3Rpb25Nb2RlQmxvY2tcIlxyXG4gICAgICAgIChmb2N1c091dCk9XCJvbkZvY3VzT3V0Um93KGl0ZW0pXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwiaXRlbVwiID48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICA8IS0tIDx0ZCBwRnJvemVuQ29sdW1uIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj4gLS0+XHJcblxyXG5cclxuICAgICAgICA8IS0tIDx0ZCBwRnJvemVuQ29sdW1uIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgPC90ZD4gLS0+XHJcblxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXBlbmNpbFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93IGljb249XCJwaSBwaS1jaGVja1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tc3VjY2VzcyAtbWwtMVwiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciAtbWwtMlwiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+IC0tPlxyXG4gICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0hhdmVTdW1hcnlcIiBzY29wZT1cImNvbFwiIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90ZD5cclxuXHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RHVwbGljYXRlQnV0dG9uXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICAgICAgPFRzaS1CdXR0b24gW2J1dHRvblR5cGVdPVwiYnV0dG9uVHlwZS5CdXR0b25cIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1jb3B5XCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfZHVwbGlxdWVyXCJcclxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm9cIiAoY2xpY2spPVwiZHVwbGljYXRlUm93KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93Q29uc3VsdEJ1dHRvblwiIHN0eWxlPVwibGVmdDogLTFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICBjbGFzcz1cInAtMSBidG4tY29uc3VsdC1zdHlsZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICA8VHNpLUJ1dHRvbiBbYnV0dG9uVHlwZV09XCJidXR0b25UeXBlLkJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWV5ZVwiXHJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgdG9vbHRpcFRleHQ9XCJzaGFyZWRfZWRpdHRhYmxlX2NvbnN1bHRlclwiXHJcbiAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zZWNvbmRhcnlcIiAoY2xpY2spPVwiY29uc3VsdChpdGVtKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0RlbGV0ZUJ1dHRvblwiXHJcbiAgICAgICAgICBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICBjbGFzcz1cInAtMSBidG4tZGVsZXRlLXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtkaXNhYmxlZF09XCJpc0RlbGV0ZUJ1dHRvbkRpc2FibGVkKGl0ZW0pXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLXRyYXNoXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfc3VwcHJpbWVyXCJcclxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcblxyXG4gICAgICAgIDx0ZCBjbGFzcz1cInVpLXJlc2l6YWJsZS1jb2x1bW5cIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiY29sLmlzRnJvemVuXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgIFtjbGFzcy50c2ktY29sLXdyYXBdPVwic2hvdWxkV3JhcENvbHVtbihjb2wpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldEJvZHlDb2x1bW5TdHlsZShjb2wpXCI+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5kaXNwbGF5T25seSB8fCBkaXNhYmxlZDsgZWxzZSBvcmRpbmFyeUJsb2NcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5TRUFSQ0hfQ09NQk87IGVsc2UgY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2Rpc2FibGVkXT1cInRydWVcIiBbZWxlbWVudFNvdXJjZVVybF09XCJjb2wuZWxlbWVudFNvdXJjZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiIFsoYmluZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICBpZC1maWVsZD1cInt7Y29sLmlkRmllbGR9fVwiIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgbGFiZWwtZmllbGQ9XCJ7e2NvbC5sYWJlbEZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93U2VhcmNoQnV0dG9uXT1cImNvbC5zaG93U2VhcmNoQnV0dG9uID8/IHRydWVcIiBbc2hvd0FkZEJ1dHRvbl09XCJjb2wuc2hvd0FkZEJ1dHRvbiA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1VwZGF0ZUJ1dHRvbl09XCJjb2wuc2hvd1VwZGF0ZUJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q29uc3VsdEJ1dHRvbl09XCJjb2wuc2hvd0NvbnN1bHRCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZExhYmVsQ2hhbmdlKT1cIm9uQ2VsbExhYmVsUmVzb2x2ZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkYXRlUGlja2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5EQVRFOyBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbc2hvd1RpbWVdPVwiY29sLnNob3dUaW1lXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DSEVDS0JPWDsgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1UaW1lLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuVElNRTsgZWxzZSBmb3JtdWxhT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtZGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPjwvdHNpLXRpbWUtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUZvcm11bGEtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybXVsYU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5GT1JNVUxBX1RFWFRfQk9YOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tpdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNvcmRpbmFyeUJsb2M+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlNFQVJDSF9DT01CTzsgZWxzZSBjdXJyZW5jeVNvY2lldGVJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIiBbbGlzdFNvdXJjZVVybF09XCJjb2wubGlzdFNvdXJjZVVybFwiIFsoYmluZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCIgbGFiZWwtZmllbGQ9XCJ7e2NvbC5sYWJlbEZpZWxkfX1cIiBbaXNGaWx0ZXJlZF09XCJjb2wuaXNGaWx0ZXJlZFwiXHJcbiAgICAgICAgICAgICAgICBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiIChiaW5kQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIFtkYXRhc291cmNlXT1cImNvbC5kYXRhc291cmNlXCIgW3Nob3dTZWFyY2hCdXR0b25dPVwiY29sLnNob3dTZWFyY2hCdXR0b24gPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbc2hvd0FkZEJ1dHRvbl09XCJjb2wuc2hvd0FkZEJ1dHRvbiA/PyB0cnVlXCIgW3Nob3dVcGRhdGVCdXR0b25dPVwiY29sLnNob3dVcGRhdGVCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgIFtzaG93Q29uc3VsdEJ1dHRvbl09XCJjb2wuc2hvd0NvbnN1bHRCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWRMYWJlbENoYW5nZSk9XCJvbkNlbGxMYWJlbFJlc29sdmVkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVNvY2lldGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlcklucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfSU5QVVQ7IGVsc2UgZGF0ZVBpY2tlcklucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREFURTsgZWxzZSBjaGVja0JveElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1QaWNrZXIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW3Nob3dUaW1lXT1cImNvbC5zaG93VGltZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtUGlja2VyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3ggLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUNoZWNrQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIiBcclxuICAgICAgICAgICAgICAgICAgW2lzQmluYXJ5XT1cImNvbC5pc0JpbmFyeSA/PyBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktQ2hlY2tCb3g+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlcklucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLUlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktSW50ZWdlciAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5JTlRFR0VSOyBlbHNlIHJhdGVJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUludGVnZXIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuUkFURV9JTlBVVDsgZWxzZSB0aW1lSW5wdXRCbG9jXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLVJhdGUtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtcGlja2VyIGJsb2MgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGltZUlucHV0QmxvYz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FOyBlbHNlIGZvcm11bGFJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8dHNpLXRpbWUtcGlja2VyIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvdHNpLXRpbWUtcGlja2VyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5GT1JNVUxBX1RFWFRfQk9YOyBlbHNlIGRlZmF1bHRUZXh0SW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLTxUc2ktQnViYmxlLUluZm9cclxuICAgICAgICAgICAgICAgICAgW2luZm9UZXh0XT1cIlsnZm9ybXVsYV9leHBsaWNhdGlvbicsXHJcbiAgICAgICAgICAgICAgICAgIF1cIj48L1RzaS1CdWJibGUtSW5mbz4gLS0+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPjwvVHNpLUZvcm11bGEtQm94PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRleHRJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLVRleHQtQm94IFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLVRleHQtQm94PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkICpuZ0lmPVwic2hvd1Jvd1N1bW1hcnlcIiBjbGFzcz1cImZvbnQtYm9sZFwiPlxyXG4gICAgICAgICAge3tyb3dTdW1tYXJ5KGl0ZW0pfX1cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3Rpb25Nb2RlQmxvY2s+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cIml0ZW1cIiBbcFNlbGVjdGFibGVSb3ddPVwiaXRlbVwiIFtwU2VsZWN0YWJsZVJvd0luZGV4XT1cInJvd0luZGV4XCJcclxuICAgICAgICAgICAgKGZvY3VzT3V0KT1cIm9uRm9jdXNPdXRSb3coaXRlbSlcIj5cclxuXHJcbiAgICAgICA8IS0tIDx0ZCBwRnJvemVuQ29sdW1uIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj4gLS0+XHJcblxyXG4gICAgICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiIHN0eWxlPVwid2lkdGg6IDJyZW07XCI+XHJcbiAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAjdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgICAgPC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0VkaXRCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtO2xlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLWNoZWNrXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tc3VjY2VzcyAtbWwtMVwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93IGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciAtbWwtMlwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+IC0tPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uIHBSZXNpemFibGVDb2x1bW4gKm5nSWY9XCJzaG93RHVwbGljYXRlQnV0dG9uXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW2J1dHRvblR5cGVdPVwiYnV0dG9uVHlwZS5CdXR0b25cIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1jb3B5XCJcclxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgdG9vbHRpcFRleHQ9XCJzaGFyZWRfZWRpdHRhYmxlX2R1cGxpcXVlclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24taW5mb1wiIChjbGljayk9XCJkdXBsaWNhdGVSb3coaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBwUmVzaXphYmxlQ29sdW1uICpuZ0lmPVwic2hvd0NvbnN1bHRCdXR0b25cIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTEgYnRuLWNvbnN1bHQtc3R5bGVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbYnV0dG9uVHlwZV09XCJidXR0b25UeXBlLkJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWV5ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9jb25zdWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiIChjbGljayk9XCJjb25zdWx0KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLTEgYnRuLWRlbGV0ZS1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQnV0dG9uIHR5cGU9XCJidXR0b25cIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS10cmFzaFwiIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9zdXBwcmltZXJcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZShpdGVtKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInVpLXJlc2l6YWJsZS1jb2x1bW5cIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiY29sLmlzRnJvemVuXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbY2xhc3MudHNpLWNvbC13cmFwXT1cInNob3VsZFdyYXBDb2x1bW4oY29sKVwiIFtuZ1N0eWxlXT1cImdldEJvZHlDb2x1bW5TdHlsZShjb2wpXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZGlzcGxheU9ubHkgfHwgZGlzYWJsZWQ7IGVsc2Ugb3JkaW5hcnlCbG9jXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5TRUFSQ0hfQ09NQk87IGVsc2UgY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2Rpc2FibGVkXT1cInRydWVcIiBbZWxlbWVudFNvdXJjZVVybF09XCJjb2wuZWxlbWVudFNvdXJjZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiIFsoYmluZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICBpZC1maWVsZD1cInt7Y29sLmlkRmllbGR9fVwiIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgbGFiZWwtZmllbGQ9XCJ7e2NvbC5sYWJlbEZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93U2VhcmNoQnV0dG9uXT1cImNvbC5zaG93U2VhcmNoQnV0dG9uID8/IHRydWVcIiBbc2hvd0FkZEJ1dHRvbl09XCJjb2wuc2hvd0FkZEJ1dHRvbiA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1VwZGF0ZUJ1dHRvbl09XCJjb2wuc2hvd1VwZGF0ZUJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q29uc3VsdEJ1dHRvbl09XCJjb2wuc2hvd0NvbnN1bHRCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZExhYmVsQ2hhbmdlKT1cIm9uQ2VsbExhYmVsUmVzb2x2ZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkYXRlUGlja2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5EQVRFOyBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbc2hvd1RpbWVdPVwiY29sLnNob3dUaW1lXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DSEVDS0JPWDsgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1UaW1lLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuVElNRTsgZWxzZSBmb3JtdWxhT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtZGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPjwvdHNpLXRpbWUtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUZvcm11bGEtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybXVsYU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5GT1JNVUxBX1RFWFRfQk9YOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tpdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3JkaW5hcnlCbG9jPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktU2VhcmNoLUNvbWJvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgWyhiaW5kKV09XCJpdGVtW2NvbC5maWVsZF1cIiBpZC1maWVsZD1cInt7Y29sLmlkRmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwtZmllbGQ9XCJ7e2NvbC5sYWJlbEZpZWxkfX1cIiBbaXNGaWx0ZXJlZF09XCJjb2wuaXNGaWx0ZXJlZFwiIFtidXNpbmVzc0NsYXNzXT1cImNvbC5idXNpbmVzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAoYmluZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2N1cnJlbnRSb3dJdGVtXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhc291cmNlXT1cImNvbC5kYXRhc291cmNlXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWFyY2hCdXR0b25dPVwiY29sLnNob3dTZWFyY2hCdXR0b24gPz8gdHJ1ZVwiIFtzaG93QWRkQnV0dG9uXT1cImNvbC5zaG93QWRkQnV0dG9uID8/IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93VXBkYXRlQnV0dG9uXT1cImNvbC5zaG93VXBkYXRlQnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDb25zdWx0QnV0dG9uXT1cImNvbC5zaG93Q29uc3VsdEJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTGFiZWxDaGFuZ2UpPVwib25DZWxsTGFiZWxSZXNvbHZlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlcklucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCIgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXJJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5EQVRFOyBlbHNlIGNoZWNrQm94SW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1QaWNrZXIgW3Nob3dUaW1lXT1cImNvbC5zaG93VGltZVwiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLVBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpc0JpbmFyeV09XCJjb2wuaXNCaW5hcnkgPz8gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUOyBlbHNlIGludGVnZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktSW50ZWdlciAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXIgW2NsYXNzXT1cIidtYXgtdy00cmVtJ1wiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlJBVEVfSU5QVVQ7IGVsc2UgdGltZUlucHV0QmxvY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aW1lSW5wdXRCbG9jPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FIGVsc2UgZm9ybXVsYUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtcGlja2VyIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHNpLXRpbWUtcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuRk9STVVMQV9URVhUX0JPWDsgZWxzZSBkZWZhdWx0VGV4dElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1UZXh0LUJveCBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkICpuZ0lmPVwic2hvd1Jvd1N1bW1hcnlcIiBjbGFzcz1cImZvbnQtYm9sZFwiPlxyXG4gICAgICAgICAgICAgIHt7cm93U3VtbWFyeShpdGVtKX19XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwic2hvd0hhdmVTdW1hcnlcIiBwVGVtcGxhdGU9XCJmb290ZXJcIiBsZXQtY29sdW1ucz5cclxuXHJcbiAgICAgIDx0ciBjbGFzcz1cInRmb290ZXJcIj5cclxuICAgICAgICA8IS0tIDx0ZCBwRnJvemVuQ29sdW1uIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RkPiAtLT5cclxuICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6MnJlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDoycmVtICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICN0YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gc2NvcGU9XCJjb2xcIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj5Ub3RhbDwvdGQ+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgIDwhLS08dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xXCI+IC0tPlxyXG4gICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0R1cGxpY2F0ZUJ1dHRvblwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93Q29uc3VsdEJ1dHRvblwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJjb2wuaXNGcm96ZW5cIiBbc3R5bGVdPVwiY29sLnN0eWxlXCIgW25nU3R5bGVdPVwiZ2V0Q29sdW1uU2l6ZVN0eWxlKGNvbClcIiBzY29wZT1cImNvbFwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiXHJcbiAgICAgICAgICBbY2xhc3MudHNpLWNvbC13cmFwXT1cInNob3VsZFdyYXBDb2x1bW4oY29sKVwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5oYXZlU3VtbWFyeVwiPlxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfSU5QVVQ7IGVsc2UgZGVjaW1hbE91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUOyBlbHNlIGludGVnZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktSW50ZWdlci1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5JTlRFR0VSOyBlbHNlIHJhdGVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyLURpc3BsYXkgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuUkFURV9JTlBVVDsgZWxzZSBkZWZhdWx0VGV4dE91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLVJhdGUtRGlzcGxheSBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvblwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIERlZmF1bHQgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRleHRPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgIHt7Z2V0U3VtbWFyeShjb2wpfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzdW1tYXJ5XCI+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICB7eydUb3RhbFJlY29yZHNDb3VudCcgfCBsb2NhbGl6ZSB9fSB7e2dyaWREYXRhLmxlbmd0aH19XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvcC10YWJsZT5cclxuICA8ZGl2PlxyXG4gICAgPFRzaS1CdXR0b24gKm5nSWY9XCJzaG93QWRkQnV0dG9uXCIgc3R5bGU9XCJoZWlnaHQ6IDIwcHg7d2lkdGg6IDIwcHg7XCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktcGx1c1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfYWpvdXRlclwiXHJcbiAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tc20gcC1idXR0b24tc3VjY2VzcyBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seSBuZy1zdGFyLWluc2VydGVkXCJcclxuICAgICAgKGNsaWNrKT1cImFkZFJvdygpXCI+PC9Uc2ktQnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
926
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy9lZGl0YWJsZS1ncmlkL2VkaXRhYmxlLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvZWRpdGFibGUtZ3JpZC9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUc1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQWdELE1BQU0sa0RBQWtELENBQUM7QUFDeEksT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDbkcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMs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ekIsRUFBRTtzQkFBVixLQUFLO2dCQWdiTixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRmlsdGVyU2VydmljZSwgU29ydEV2ZW50LCBUYWJsZVN0YXRlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBUYWJsZSwgVGFibGVSb3dTZWxlY3RFdmVudCwgVGFibGVSb3dVblNlbGVjdEV2ZW50IH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBCdXR0b25UeXBlLCBHcmlkU2VsZWN0aW9uTW9kZSwgSW5wdXRUeXBlcywgTW9kYWxTaXplRW51bSwgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBwcmVjaXNlQWRkLCBwcmVjaXNlU3VtIH0gZnJvbSAnLi4vLi4vLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgQ2VsbENoYW5nZWRSZXN1bHQsIEdyaWRDb2x1bW4sIElHcmlkQ29uZmlndXJhdGlvbiwgUm93QWRkZWRSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgTG9jYWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvbG9jYWxpemUucGlwZSc7XHJcbmltcG9ydCB7IENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24sIENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIE9ic2VydmFibGVDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbGxlY3Rpb24vb2JzZXJ2YWJsZS1jb2xsZWN0aW9uJztcclxuaW1wb3J0IHsgRW50aXR5VmFsaWRhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9lbnRpdHktdmFsaWRhdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IEdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgeyBGb3JtU3RhdGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZm9ybS9mb3JtLXN0YXRlJztcclxuaW1wb3J0IHsgVHNpSW5wdXRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWJhc2UvdHNpLWlucHV0LWJhc2UvdHNpLWlucHV0LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29sdW1uV2lkdGhDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvY29sdW1uLXdpZHRoLmNvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBHcmlkU2l6aW5nTW9kZSB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2dyaWQtc2l6aW5nLW1vZGUnO1xyXG5pbXBvcnQgeyBMYXlvdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGF5b3V0L2xheW91dC1oZWxwZXIuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1HZW5lcmljLUVkaXRhYmxlLUdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbR2VuZXJpY1ZhbGlkYXRpb25TdGF0ZVNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUdyaWRDb21wb25lbnQgZXh0ZW5kcyBUc2lJbnB1dEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbG9jYWwgdmFyc1xyXG4gIHByaXZhdGUgc2F2ZUV2ZW50U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2lzQXV0b1Jvd051bWJlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2F1dG9Sb3dOdW1iZXJGaWVsZDogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFJvd051bWJlcjogbnVtYmVyID0gMDtcclxuICB0b29sdGlwUG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb247XHJcbiAgaXNBcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2dyaWREYXRhOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcHJpdmF0ZSBfZXF1YXRhYmxlRmllbGRzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3N1bUF0RnVzaW9uRmllbGRzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VxdWFsaXR5Q2hlY2tPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2Y2U291cmNlUm93OiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BlbmRpbmdEdXBsaWNhdGVFbWl0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdDogUm93QWRkZWRSZXN1bHQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUFSQ0hfTEFCRUxfUFJFRklYID0gJ19fc2VhcmNoX2xhYmVsX18nO1xyXG5cclxuICAvKipcclxuICAgKiBOYW1lIG9mIHRoZSBjdXN0b20gUHJpbWVORyBmaWx0ZXIgcmVnaXN0ZXJlZCBmb3IgZ2xvYmFsIHNlYXJjaC5cclxuICAgKiBFeHRlbmRzIHRoZSBidWlsdC1pbiAnY29udGFpbnMnIHdpdGggbG9jYWxlLWF3YXJlIGRlY2ltYWwgbWF0Y2hpbmdcclxuICAgKiAoY29tbWEgdnMgZG90IHNlcGFyYXRvcikgd2hpbGUga2VlcGluZyBmdWxsIHByb3RlY3Rpb24gYWdhaW5zdCBmYWxzZVxyXG4gICAqIHBvc2l0aXZlcyBvbiB0ZXh0IGNvbHVtbnMuXHJcbiAgICogQHNlZSBfcmVnaXN0ZXJHcmlkQ29udGFpbnNGaWx0ZXJcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUNJTUFMX0FXQVJFX0NPTlRBSU5TX0ZJTFRFUiA9ICdncmlkLWNvbnRhaW5zJztcclxuICBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGU7XHJcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICAvLyNlbmRyZWdpb25cclxuICBpbnB1dFR5cGVzID0gSW5wdXRUeXBlcztcclxuICBtb2RhbFNpemUgPSBNb2RhbFNpemVFbnVtLkV4dHJhTGFyZ2U7XHJcbiAgQFZpZXdDaGlsZChcImVkaXRhYmxlVGFibGVcIikgZWRpdGFibGVUYWJsZT86IFRhYmxlXHJcblxyXG4gIGJ1dHRvblR5cGUgPSBCdXR0b25UeXBlO1xyXG5cclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1zOiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZEl0ZW06IGFueTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbnB1dHNcclxuICBASW5wdXQoJ2NvbmZpZ3VyYXRpb24nKSBjb25maWd1cmF0aW9uPzogSUdyaWRDb25maWd1cmF0aW9uO1xyXG4gIEBJbnB1dCgna2V5Jykga2V5OiBzdHJpbmcgPSAndWlkJztcclxuICBASW5wdXQoKSBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIHNhdmVFdmVudD86IE9ic2VydmFibGU8dm9pZD47XHJcbiAgLyoqXHJcbiAgICogQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGdsb2JhbCBzZWFyY2ggYmFyIGluIHRoZSBncmlkIGNhcHRpb24uXHJcbiAgICpcclxuICAgKiBXaGVuIGB0cnVlYCwgYSBzZWFyY2ggaW5wdXQgYW5kIGJ1dHRvbiBhcmUgZGlzcGxheWVkLCBhbGxvd2luZyB1c2VycyB0b1xyXG4gICAqIGZpbHRlciByb3dzIGFjcm9zcyBhbGwgdmlzaWJsZSBjb2x1bW5zIHNpbXVsdGFuZW91c2x5LiBTdXBwb3J0cyBwbGFpbiB0ZXh0LFxyXG4gICAqIGRyb3Bkb3duIGxhYmVscyAocmVzb2x2ZWQgdmlhIHNoYWRvdyBmaWVsZHMpLCBhbmQgZGVjaW1hbCB2YWx1ZXMgd2l0aFxyXG4gICAqIGxvY2FsZS1hd2FyZSBjb21tYS9kb3QgbWF0Y2hpbmcuXHJcbiAgICpcclxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIHRvIHByZXNlcnZlIHRoZSBleGlzdGluZyBiZWhhdmlvdXIgZm9yIGFsbCBjb25zdW1lcnNcclxuICAgKiB0aGF0IGRvIG5vdCBleHBsaWNpdGx5IG9wdCBpbiDigJQgZW5hYmxpbmcgaXQgb24gYSBzcGVjaWZpYyBncmlkIGlzIGFzIHNpbXBsZVxyXG4gICAqIGFzIGFkZGluZyBgW3Nob3dHbG9iYWxTZWFyY2hdPVwidHJ1ZVwiYC5cclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93R2xvYmFsU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcbiAgQElucHV0KCkgc2hvd0RlbGV0ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93RWRpdEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93Um93U3VtbWFyeTogYm9vbGVhbiA9IGZhbHNlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcblxyXG4gIEBJbnB1dCgpIHNjcm9sbEhlaWdodDogc3RyaW5nID0gJzUwMHB4JztcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsbCAoZGVmYXVsdCk6IHRoZSB0YWJsZSBzdHJldGNoZXMgdG8gZmlsbCBpdHMgY29udGFpbmVyLiBIdWc6IHRoZSB0YWJsZSBzaHJpbmtzIHRvXHJcbiAgICogaXRzIGNvbHVtbnMnIHNpemUgKG5ldmVyIHdpZGVyIHRoYW4gdGhlIGNvbnRhaW5lciksIGxlYXZpbmcgbGVmdG92ZXIgd2lkdGggZW1wdHkuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2l6aW5nTW9kZTogR3JpZFNpemluZ01vZGUgPSBHcmlkU2l6aW5nTW9kZS5GaWxsO1xyXG5cclxuICAvKipcclxuICAgKiBTaXppbmcgc3R5bGUgYm91bmQgdG8gdGhlIHAtdGFibGUncyBgW3RhYmxlU3R5bGVdYCDigJQgdGhlIHNpbmdsZSBsZXZlciB0aGF0IGRpc3Rpbmd1aXNoZXNcclxuICAgKiBGaWxsIGZyb20gSHVnIChzZWUgR3JpZFNpemluZ01vZGUpLiBBcHBsaWVkIGlubGluZSBvbiB0aGUgUHJpbWVORyB0YWJsZSwgc28gaXQgYmVhdHNcclxuICAgKiBQcmltZU5HJ3MgZGVmYXVsdCBgLnAtZGF0YXRhYmxlLXRhYmxlIHsgd2lkdGg6IDEwMCUgfWAgd2l0aCBubyBgIWltcG9ydGFudGAvYDo6bmctZGVlcGAuXHJcbiAgICogLSBGaWxsOiBkZWZhdWx0IChubyBmb3JjZWQgd2lkdGg7IFByaW1lTkcgZmlsbHMgdGhlIGNvbnRhaW5lcikuXHJcbiAgICogLSBIdWc6IGB3aWR0aDphdXRvYCBzaHJpbmtzIHRoZSB0YWJsZSB0byBpdHMgY29sdW1uczsgYG1heC13aWR0aDoxMDAlYCBrZWVwcyBpdCBpbnNpZGUgdGhlXHJcbiAgICogICBwYWdlIChvdmVyZmxvdyBzY3JvbGxzKTsgYG1pbi13aWR0aDowYCBhdm9pZHMgYW55IGluaGVyaXRlZCBmbG9vci5cclxuICAgKlxyXG4gICAqIEh1ZyArIGBjb2x1bW5SZXNpemVNb2RlPVwiZXhwYW5kXCJgOiBkcmFnZ2luZyBhIGNvbHVtbiByZXNpemVzIHRoYXQgY29sdW1uLCBidXQgYHdpZHRoOmF1dG9gXHJcbiAgICogaXMgcmUtYXNzZXJ0ZWQgb24gY2hhbmdlIGRldGVjdGlvbiwgc28gdGhlIHRhYmxlIGl0c2VsZiBzdGF5cyBodWdnZWQgYW5kIG5ldmVyIGV4cGFuZHMuXHJcbiAgICovXHJcbiAgZ2V0IHRhYmxlU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXppbmdNb2RlID09PSBHcmlkU2l6aW5nTW9kZS5IdWdcclxuICAgICAgPyB7ICd3aWR0aCc6ICdhdXRvJywgJ21pbi13aWR0aCc6ICcwJywgJ21heC13aWR0aCc6ICcxMDAlJyB9XHJcbiAgICAgIDoge307XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHJvd1BlclBhZ2U6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XHJcbiAgLy8gQElucHV0KCkgaXNQYWdpbmF0b3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSA1XHJcbiAgQElucHV0KCkgZW50aXR5UHJpbWFyeUtleU5hbWUgOiBzdHJpbmcgPSAndWlkJ1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcblxyXG4gIGdldCBzZWxlY3RlZENvbHVtbnMoKTogQXJyYXk8R3JpZENvbHVtbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHNldCBzZWxlY3RlZENvbHVtbnModmFsdWU6IEFycmF5PEdyaWRDb2x1bW4+KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3N5bmNHbG9iYWxGaWx0ZXJGaWVsZHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgcHJpdmF0ZSBfdGVtcENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgcHJpdmF0ZSBfY29sdW1uc0NoYW5nZWRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgLyoqIENvbHVtbiBvcmRlciBvZiB0aGUgcHJlc2VudGF0aW9uIGxhc3QgcmVzdG9yZWQuIEtlcHQgc28gY29sdW1ucyB0aGF0IG9ubHkgYXJyaXZlIGFmdGVyd2FyZHNcclxuICAgKiAg4oCUIHRoZSBvd25lciBidWlsZHMgb3IgaW5zZXJ0cyB0aGVtIG9uIGFzeW5jIHJlc3BvbnNlcyDigJQgYXJlIGxhaWQgb3V0IHBlciB0aGF0IHNhdmVkIGxheW91dFxyXG4gICAqICBpbnN0ZWFkIG9mIHJlc2V0dGluZyBpdCB0byBcImV2ZXJ5IGNvbHVtbiwgZGVmYXVsdCBvcmRlclwiLiAqL1xyXG4gIHByaXZhdGUgX3Jlc3RvcmVkQ29sdW1uT3JkZXI/OiBzdHJpbmdbXTtcclxuXHJcbiAgZ2V0IGNvbHVtbnMoKTogQXJyYXk8R3JpZENvbHVtbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgY29sdW1ucyh2YWx1ZTogQXJyYXk8R3JpZENvbHVtbj4gfCBPYnNlcnZhYmxlQ29sbGVjdGlvbjxHcmlkQ29sdW1uPikge1xyXG4gICAgdGhpcy5fY29sdW1uc0NoYW5nZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgaXNPYnNlcnZhYmxlID0gKHZhbHVlIGFzIE9ic2VydmFibGVDb2xsZWN0aW9uPEdyaWRDb2x1bW4+KS5pc09ic2VydmFibGVDb2xsZWN0aW9uID09PSB0cnVlO1xyXG4gICAgY29uc3QgaXRlbXMgPSBpc09ic2VydmFibGUgPyAodmFsdWUgYXMgT2JzZXJ2YWJsZUNvbGxlY3Rpb248R3JpZENvbHVtbj4pLnRvQXJyYXkoKSA6IHZhbHVlIGFzIEFycmF5PEdyaWRDb2x1bW4+O1xyXG4gICAgaXRlbXMuZm9yRWFjaChlbCA9PiBlbC50cmFuc2xhdGVkSGVhZGVyID0gdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybShlbC5oZWFkZXIgPz8gXCJcIikpO1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBbLi4uaXRlbXNdO1xyXG4gICAgdGhpcy5fcmVhcHBseVJlc3RvcmVkQ29sdW1uT3JkZXIoKTtcclxuXHJcbiAgICBpZiAoaXNPYnNlcnZhYmxlKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNDaGFuZ2VkU3Vic2NyaXB0aW9uID0gKHZhbHVlIGFzIE9ic2VydmFibGVDb2xsZWN0aW9uPEdyaWRDb2x1bW4+KS5jaGFuZ2VkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJldmVudCBjaGFuZ2VkID0+IFwiLCBldmVudClcclxuICAgICAgICB0aGlzLl9vbkNvbHVtbnNDaGFuZ2VkKGV2ZW50KVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92ZXJpZnlHcmlkUmVxdWlyZW1lbnRzKCk7XHJcbiAgICB0aGlzLl9pbml0Q3VycmVudFJvd051bWJlckFuZE9yZGVyQnlSb3dOdW1iZXIoKTtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IGdyaWREYXRhKGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIHRoaXMuX2dyaWREYXRhID0gZGF0YTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gIH1cclxuICBnZXQgZ3JpZERhdGEoKSB7IHJldHVybiB0aGlzLl9ncmlkRGF0YTsgfVxyXG5cclxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XHJcblxyXG5cclxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NhdmVCdXR0b246IGJvb2xlYW4gPSB0cnVlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkNvbHVtbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuXHJcblxyXG4gIEBJbnB1dCgpIGVuYWJsZVJvd0Rpc2FibGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSByb3dTdW1tYXJ5Q29uZmlnOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgQElucHV0KCkgc2hvd0hhdmVTdW1hcnk/OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd1Jvd1N1bWFyeT86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqc2VsZWN0aW9uICovXHJcbiAgQElucHV0KCkgc2VsZWN0S2V5T25seTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkgPSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGU7XHJcbiAgQElucHV0KCkgc2hvd0NvbnN1bHRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzczogc3RyaW5nID0gXCJcIjtcclxuICBnZXQgZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzO1xyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcyhjbGFzc05hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcyA9IGNsYXNzTmFtZTtcclxuICAgIHRoaXMuZ2VuZXJpY1ZhbGlkYXRpb25TdGF0ZVNlcnZpY2U/LmxvYWRFbnRpdHlWYWxpZGF0aW9uSW5mb3ModGhpcy5fZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqb3JkZXIgKi9cclxuICBASW5wdXQoKSBvcmRlckNvbHVtbjogc3RyaW5nID0gJ3VpZCc7XHJcblxyXG4gIEBJbnB1dCgpIGRlbGV0ZUxpbmVCdXR0b25EaXNhYmxlZCE6IChpdGVtOiBhbnkpID0+IGFueVxyXG5cclxuICBASW5wdXQoKSBzaG93RHVwbGljYXRlQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcblxyXG4gIEBPdXRwdXQoKSByZWZyZXNoRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy9AT3V0cHV0KCkgYWN0aW9uRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8R3JpZEFjdGlvbkVtaXRSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQWN0aW9uRW1pdFJlc3VsdD4oKTtcclxuXHJcbiAgQE91dHB1dCgpIHNhdmVEYXRhRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpIHJvd0NoYW5nZWRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRSb3dFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgYWRkZWRSb3dFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxSb3dBZGRlZFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0FkZGVkUmVzdWx0PigpXHJcblxyXG4gIEBPdXRwdXQoKSBmb2N1c091dEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBAT3V0cHV0KCkgY2VsbENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDZWxsQ2hhbmdlZFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDaGFuZ2VkUmVzdWx0PigpO1xyXG5cclxuICBAT3V0cHV0KCkgcm93RGVsZXRlZEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvY3VzT3V0Um93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvbkNvbnN1bHRDbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSByb3dEdXBsaWNhdGVkRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8Um93QWRkZWRSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dBZGRlZFJlc3VsdD4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgQFZpZXdDaGlsZChcImR0XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZHQ6IFRhYmxlIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKSBpZD86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2tzIHJvd3MgYnkgdGhlaXIgYnVzaW5lc3Mga2V5IChga2V5YCBpbnB1dCkgc28gUHJpbWVORyByZXVzZXMgZXhpc3Rpbmcgcm93IHZpZXdzXHJcbiAgICogaW5zdGVhZCBvZiBkZXN0cm95aW5nL3JlY3JlYXRpbmcgdGhlbSB3aGVuIHRoZSByb3cgYXJyYXkgaXMgcmVwbGFjZWQgd2l0aCBvYmplY3RzIHNoYXJpbmdcclxuICAgKiB0aGUgc2FtZSBrZXkgKGUuZy4gYWZ0ZXIgYSByZWNhbGN1bGF0aW9uIHRoYXQgY2xvbmVzIHRoZSBkYXRhKS4gV2l0aG91dCB0aGlzLCBldmVyeSBjZWxsXHJcbiAgICogZWRpdG9yIOKAlCBpbmNsdWRpbmcgc2VydmVyLWJhY2tlZCBzZWFyY2ggY29tYm9zIOKAlCBpcyByZS1pbnN0YW50aWF0ZWQgYW5kIHJlLWZldGNoZXMgaXRzIGRhdGEuXHJcbiAgICogRmFsbHMgYmFjayB0byB0aGUgcm93IGluZGV4IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQgKGUuZy4gYnJhbmQtbmV3IHJvd3MpLlxyXG4gICAqIEFycm93IHByb3BlcnR5IHNvIGB0aGlzYCBpcyBwcmVzZXJ2ZWQgd2hlbiBQcmltZU5HIGludm9rZXMgaXQuXHJcbiAgICovXHJcbiAgcm93VHJhY2tCeSA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBhbnkgPT4gaXRlbT8uW3RoaXMua2V5XSA/PyBpbmRleDtcclxuXHJcbiAgcHJpdmF0ZSBfZW50aXR5VmFsaWRhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KEVudGl0eVZhbGlkYXRpb25zU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBfc3RyaXBlZFJvd3NMYXlvdXRIZWxwZXJTZXJ2aWNlID0gaW5qZWN0KExheW91dEhlbHBlclNlcnZpY2UpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2NhbGl6ZVBpcGU6IExvY2FsaXplUGlwZSwgcHJpdmF0ZSBfZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuX3JlZ2lzdGVyR3JpZENvbnRhaW5zRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RyaXBlZFJvd3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RyaXBlZFJvd3NMYXlvdXRIZWxwZXJTZXJ2aWNlLmxheW91dENvbmZpZ3VyYXRpb24uaXNTdHJpcGVkUm93c0VuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KClcclxuICAgIHRoaXMuX2luaXRTYXZlRXZlbnRTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuX3ZlcmlmeUdyaWRSZXF1aXJlbWVudHMoKTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gICAgdGhpcy5faW5pdEVxdWF0YWJsZUZpZWxkcygpO1xyXG4gICAgdGhpcy5faW5pdFN1bUF0RnVzaW9uRmllbGRzKCk7XHJcbiAgICBcclxuICAgIGxldCBsYW5ndWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShydGxNb2RlS2V5cy5ydGxNb2RlRW5hYmxlZCk7XHJcbiAgICBcclxuICAgIGlmIChsYW5ndWUgJiYgSlNPTi5wYXJzZShsYW5ndWUpKSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IHRydWVcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQXIgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMgfHwgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl90ZW1wQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuICB9XHJcblxyXG4gIGZpbmRDb2x1bW5CeUtleShrZXk6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICBmb3IgKGxldCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbC5oZWFkZXIgPT09IGtleSB8fCBjb2wuZmllbGQgPT09IGtleSkgcmV0dXJuIGNvbDtcclxuICAgICAgICBlbHNlIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyByZXN0b3JlU3RhdGUoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICB0aGlzLl9yZXN0b3JlZENvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXIgPz8gdGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcjtcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgIHRoaXMuY29sdW1uV2lkdGguc2V0UmVtZW1iZXJlZChzdGF0ZS5jb2x1bW5XaWR0aHMpO1xyXG4gICAgICB0aGlzLmR0LmNvbHVtbldpZHRoc1N0YXRlID0gc3RhdGUuY29sdW1uV2lkdGhzO1xyXG4gICAgICB0aGlzLmR0LnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XHJcblxyXG4gICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcclxuXHJcbiAgICAgIGlmIChjb2x1bW5PcmRlcikge1xyXG4gICAgICAgIGxldCByZW9yZGVyZWRDb2x1bW5zID0gdGhpcy5nZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyKTtcclxuICAgICAgICBpZiAocmVvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBcHBseSB0aGUgcmVtZW1iZXJlZCBjb2x1bW4gd2lkdGhzIHRvIHRoZSBET00uIEFzc2lnbmluZyBjb2x1bW5XaWR0aHNTdGF0ZVxyXG4gICAgICAvLyBhbG9uZSBpcyBhIG5vLW9wIGhlcmUgYmVjYXVzZSB0aGUgZ3JpZCBpcyBub3QgUHJpbWVORy1cInN0YXRlZnVsXCIgKG5vIHN0YXRlS2V5KS5cclxuICAgICAgdGhpcy5kdC5yZXN0b3JlQ29sdW1uV2lkdGhzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyOiBzdHJpbmdbXSk6IGFueVtdIHtcclxuICAgIGxldCByZW9yZGVyZWRDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGNvbHVtbk9yZGVyLm1hcCgoa2V5KSA9PiB7XHJcbiAgICAgIGxldCBjb2wgPSB0aGlzLmZpbmRDb2x1bW5CeUtleShrZXkpO1xyXG4gICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgcmVvcmRlcmVkQ29sdW1ucy5wdXNoKGNvbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZW9yZGVyZWRDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICB0aGlzLl9yZXN0b3JlZENvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXIgPz8gdGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcjtcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgIHRoaXMuY29sdW1uV2lkdGgucmVzZXQoKTtcclxuICAgICAgdGhpcy5jb2x1bW5XaWR0aC5zZXRSZW1lbWJlcmVkKHN0YXRlLmNvbHVtbldpZHRocyk7XHJcbiAgICAgIHRoaXMuZHQuY29sdW1uV2lkdGhzU3RhdGUgPSBzdGF0ZS5jb2x1bW5XaWR0aHM7XHJcbiAgICAgIHRoaXMuZHQudGFibGVXaWR0aFN0YXRlID0gc3RhdGUudGFibGVXaWR0aDtcclxuXHJcbiAgICAgIGxldCBjb2x1bW5PcmRlciA9IHN0YXRlLmNvbHVtbk9yZGVyO1xyXG5cclxuICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XHJcbiAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXIpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwID8gcmVvcmRlcmVkQ29sdW1ucyA6IFsuLi50aGlzLl9jb2x1bW5zXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kdC5yZXN0b3JlQ29sdW1uV2lkdGhzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0ZSgpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5kdCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kdC5yZXNpemFibGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuZHQuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kdC5zYXZlQ29sdW1uT3JkZXIoc3RhdGUpO1xyXG5cclxuICAgIHJldHVybiBzdGF0ZVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hhcmVkIG1vZGVsIGZvciB0aGUgZGV2ZWxvcGVyLXdpZHRoIC8gd3JhcHBpbmcgLyByZXNpemUtcHJpb3JpdHkgYmVoYXZpb3IuIEFjdGlvbi9idXR0b25cclxuICAgKiBjb2x1bW5zIGFuZCBmcm96ZW4gY29sdW1ucyBhcmUgZXhjbHVkZWQgKGZyb3plbiBjb2x1bW5zIG11c3Qga2VlcCB0aGVpciBzdGlja3ktb2Zmc2V0XHJcbiAgICogd2lkdGggb3IgbGF0ZXIgZnJvemVuIGNvbHVtbnMgbWlzYWxpZ24pOyBhbGwgb3RoZXIgY29sdW1ucyBhcmUgZWxpZ2libGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2x1bW5XaWR0aCA9IG5ldyBDb2x1bW5XaWR0aENvbnRyb2xsZXIoKGNvbCkgPT4gIWNvbC5pc0J1dHRvbiAmJiAhY29sLmlzRnJvemVuKTtcclxuXHJcbiAgLyoqIFJlbWVtYmVyIHdoaWNoIGNvbHVtbiB0aGUgdXNlciByZXNpemVkIHNvIGl0cyBkZXZlbG9wZXItcHJlZmVycmVkIHdpZHRoIHlpZWxkcy4gKi9cclxuICBvbkNvbFJlc2l6ZShldmVudDogeyBlbGVtZW50PzogSFRNTEVsZW1lbnQ7IGRlbHRhPzogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgIHRoaXMuY29sdW1uV2lkdGgub25SZXNpemUoZXZlbnQ/LmVsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnZGF0YS1maWVsZCcpKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIGEgY29sdW1uJ3MgY29udGVudCBzaG91bGQgd3JhcCB0byBzdGF5IGluc2lkZSBpdHMgY29uc3RyYWluZWQgd2lkdGguICovXHJcbiAgc2hvdWxkV3JhcENvbHVtbihjb2w6IEdyaWRDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbldpZHRoLnNob3VsZFdyYXAoY29sKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldmVsb3BlciBzaXplIHN0eWxlIG9ubHksIGJvdW5kIHZpYSBgW25nU3R5bGVdYCBvbiB0aGUgaGVhZGVyL3N1bW1hcnkgY2VsbHMgYWxvbmdzaWRlXHJcbiAgICogdGhlaXIgdW50b3VjaGVkIGBbc3R5bGVdPVwiY29sLnN0eWxlXCJgIChzbyBhIHN0cmluZyBgY29sLnN0eWxlYCBpcyBuZXZlciBzcHJlYWQvYnJva2VuKS5cclxuICAgKi9cclxuICBnZXRDb2x1bW5TaXplU3R5bGUoY29sOiBHcmlkQ29sdW1uKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5XaWR0aC5zaXplU3R5bGUoY29sKTtcclxuICB9XHJcblxyXG4gIC8qKiBCb2R5IGA8dGQ+YCBzdHlsZTogUlRMIGFsaWdubWVudCArIHRvcC1hbGlnbiAoZWxpZ2libGUgY2VsbHMpICsgZGV2ZWxvcGVyIHNpemUgc3R5bGUuICovXHJcbiAgZ2V0Qm9keUNvbHVtblN0eWxlKGNvbDogR3JpZENvbHVtbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgY29uc3QgYmFzZSA9IHRoaXMuaXNBciA/IHsgJ3RleHQtYWxpZ24nOiAnc3RhcnQnIH0gOiB7fTtcclxuICAgIHJldHVybiB7IC4uLmJhc2UsIC4uLnRoaXMuY29sdW1uV2lkdGgudmVydGljYWxBbGlnbihjb2wpLCAuLi50aGlzLmNvbHVtbldpZHRoLnNpemVTdHlsZShjb2wpIH07XHJcbiAgfVxyXG5cclxuICBpc0RlbGV0ZUJ1dHRvbkRpc2FibGVkKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGVsZXRlTGluZUJ1dHRvbkRpc2FibGVkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWxldGVMaW5lQnV0dG9uRGlzYWJsZWQoaXRlbSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKVxyXG4gICAgdGhpcy5zYXZlRXZlbnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nRHVwbGljYXRlRW1pdCgpO1xyXG4gICAgdGhpcy5fY29sdW1uc0NoYW5nZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkNvbHVtbnNDaGFuZ2VkKGV2ZW50OiBDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50PEdyaWRDb2x1bW4+KTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uQWRkOiB7XHJcbiAgICAgICAgaWYgKGV2ZW50Lm5ld0l0ZW1zICYmIGV2ZW50Lm5ld1N0YXJ0aW5nSW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgZXZlbnQubmV3SXRlbXMuZm9yRWFjaChjb2wgPT5cclxuICAgICAgICAgICAgY29sLnRyYW5zbGF0ZWRIZWFkZXIgPSB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKGNvbC5oZWFkZXIgPz8gXCJcIilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjb25zdCBwcmV2U2VsZWN0ZWQgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRDb2x1bW5zKTtcclxuICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBbLi4udGhpcy5fY29sdW1uc107XHJcbiAgICAgICAgICBuZXdDb2x1bW5zLnNwbGljZShldmVudC5uZXdTdGFydGluZ0luZGV4LCAwLCAuLi5ldmVudC5uZXdJdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gbmV3Q29sdW1ucztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgICAgICAgIGMgPT4gcHJldlNlbGVjdGVkLmhhcyhjKSB8fCBldmVudC5uZXdJdGVtcyEuaW5jbHVkZXMoYylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLl9yZWFwcGx5UmVzdG9yZWRDb2x1bW5PcmRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uUmVtb3ZlOiB7XHJcbiAgICAgICAgaWYgKGV2ZW50Lm9sZEl0ZW1zKSB7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVkID0gbmV3IFNldChldmVudC5vbGRJdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoYyA9PiAhcmVtb3ZlZC5oYXMoYykpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoYyA9PiAhcmVtb3ZlZC5oYXMoYykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uUmVwbGFjZToge1xyXG4gICAgICAgIGlmIChldmVudC5uZXdJdGVtcyAmJiBldmVudC5vbGRJdGVtcyAmJiBldmVudC5uZXdTdGFydGluZ0luZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGV2ZW50Lm5ld0l0ZW1zLmZvckVhY2goY29sID0+XHJcbiAgICAgICAgICAgIGNvbC50cmFuc2xhdGVkSGVhZGVyID0gdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybShjb2wuaGVhZGVyID8/IFwiXCIpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc3QgcHJldlNlbGVjdGVkID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkQ29sdW1ucyk7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVkT2xkID0gbmV3IFNldChldmVudC5vbGRJdGVtcyk7XHJcbiAgICAgICAgICBjb25zdCBuZXdDb2x1bW5zID0gWy4uLnRoaXMuX2NvbHVtbnNdO1xyXG4gICAgICAgICAgbmV3Q29sdW1ucy5zcGxpY2UoZXZlbnQubmV3U3RhcnRpbmdJbmRleCwgZXZlbnQub2xkSXRlbXMubGVuZ3RoLCAuLi5ldmVudC5uZXdJdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gbmV3Q29sdW1ucztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgICAgICAgIGMgPT4gKHByZXZTZWxlY3RlZC5oYXMoYykgJiYgIXJlbW92ZWRPbGQuaGFzKGMpKSB8fCBldmVudC5uZXdJdGVtcyEuaW5jbHVkZXMoYylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLl9yZWFwcGx5UmVzdG9yZWRDb2x1bW5PcmRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIENvbGxlY3Rpb25DaGFuZ2VBY3Rpb24uUmVzZXQ6XHJcbiAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zID0gW107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBbXTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3ZlcmlmeUdyaWRSZXF1aXJlbWVudHMoKTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmUtYXBwbGllcyB0aGUgc2F2ZWQgcHJlc2VudGF0aW9uIGFmdGVyIHRoZSBjb2x1bW5zIGNoYW5nZWQsIHNvIG9ubHkgdGhlIHNhdmVkIGNvbHVtbnMgcmVuZGVyLFxyXG4gICAqIGluIHRoZSBzYXZlZCBvcmRlci4gTm8tb3AgdW50aWwgYSBsYXlvdXQgaXMgcmVzdG9yZWQsIG9yIHdoaWxlIG5vbmUgb2YgaXRzIGtleXMgcmVzb2x2ZSB5ZXRcclxuICAgKiAoa2VlcHMgdGhlIGRlZmF1bHQgXCJhbGwgY29sdW1uc1wiIGluc3RlYWQgb2YgYW4gZW1wdHkgZ3JpZCkuIFdpZHRocyBuZWVkIG5vIHJlLWFwcGx5OiB0aGVcclxuICAgKiBwb3NpdGlvbmFsIHN0eWxlIFByaW1lTkcgd3JvdGUgaW4gcmVzdG9yZVN0YXRlIG1hdGNoZXMgYWdhaW4gb25jZSB0aGUgc2F2ZWQgb3JkZXIgaXMgYmFjay5cclxuICAgKi9cclxuICBwcml2YXRlIF9yZWFwcGx5UmVzdG9yZWRDb2x1bW5PcmRlcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnModGhpcy5fcmVzdG9yZWRDb2x1bW5PcmRlcik7XHJcbiAgICBpZiAocmVvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVJdGVtcygpIHtcclxuICAgIGNvbnN0IGNsZWFuID0gdGhpcy5fY2xlYW5HcmlkRGF0YUZvckVtaXQoKTtcclxuICAgIHRoaXMuc2F2ZURhdGFFdmVudEVtaXR0ZXIuZW1pdChjbGVhbik7XHJcbiAgfVxyXG5cclxuICBhZGRSb3coKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZERhdGEpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xyXG4gICAgfVxyXG4gICAgbGV0IG5ld1JvdyA9IHRoaXMuX2luaXRSb3coKVxyXG4gICAgdGhpcy5ncmlkRGF0YS5wdXNoKG5ld1JvdylcclxuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWVcclxuICAgIGxldCByb3dBZGRlZFJlc3VsdDogUm93QWRkZWRSZXN1bHQgPSB7XHJcbiAgICAgIHJvd051bWJlcjogdGhpcy5ncmlkRGF0YS5sZW5ndGggLSAxLFxyXG4gICAgICBkYXRhOiBuZXdSb3dcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5lZGl0YWJsZVRhYmxlPy5zb3J0RmllbGQgJiYgdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRPcmRlcikge1xyXG4gICAgICB0aGlzLmVkaXRhYmxlVGFibGU/LnZhbHVlLnB1c2gobmV3Um93KVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoU29ydCgpXHJcbiAgICB0aGlzLmFkZGVkUm93RXZlbnRFbWl0dGVyLmVtaXQocm93QWRkZWRSZXN1bHQpXHJcbiAgfVxyXG5cclxuICBkdXBsaWNhdGVSb3coaXRlbTogYW55LCB1cGRhdGVTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlLCBza2lwRW1pdDogYm9vbGVhbiA9IGZhbHNlKTogUm93QWRkZWRSZXN1bHQgfCBudWxsIHtcclxuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgZHVwbGljYXRlZFJvdyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xyXG4gICAgZHVwbGljYXRlZFJvd1t0aGlzLmVudGl0eVByaW1hcnlLZXlOYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgIGlmIChjb2wuZXhjbHVkZU9uRHVwbGljYXRlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkdXBsaWNhdGVkUm93LCBjb2wuZmllbGQpKSB7XHJcbiAgICAgICAgZHVwbGljYXRlZFJvd1tjb2wuZmllbGRdID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzQXV0b1Jvd051bWJlcikge1xyXG4gICAgICBkdXBsaWNhdGVkUm93W3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF0gPSB0aGlzLl9uZXh0Um93TnVtYmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkICYmIHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0T3JkZXIpIHtcclxuICAgICAgY29uc3QgdGFibGVJbmRleCA9IHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgICBpZiAodGFibGVJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZVRhYmxlLnZhbHVlLnNwbGljZSh0YWJsZUluZGV4ICsgMSwgMCwgZHVwbGljYXRlZFJvdyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZVRhYmxlLnZhbHVlLnB1c2goZHVwbGljYXRlZFJvdyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhSW5kZXggPSB0aGlzLmdyaWREYXRhLmluZGV4T2YoaXRlbSwgMCk7XHJcbiAgICBpZiAoZGF0YUluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YS5zcGxpY2UoZGF0YUluZGV4ICsgMSwgMCwgZHVwbGljYXRlZFJvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWREYXRhLnB1c2goZHVwbGljYXRlZFJvdyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMucmVmcmVzaFNvcnQoKTtcclxuXHJcbiAgICBpZiAodXBkYXRlU2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZHVwbGljYXRlZFJvdztcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlXHJcbiAgICAgICAgPyBbZHVwbGljYXRlZFJvd11cclxuICAgICAgICA6IGR1cGxpY2F0ZWRSb3c7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0OiBSb3dBZGRlZFJlc3VsdCA9IHtcclxuICAgICAgcm93TnVtYmVyOiB0aGlzLmdyaWREYXRhLmluZGV4T2YoZHVwbGljYXRlZFJvdyksXHJcbiAgICAgIGRhdGE6IGR1cGxpY2F0ZWRSb3dcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCFza2lwRW1pdCkge1xyXG4gICAgICB0aGlzLmFkZGVkUm93RXZlbnRFbWl0dGVyLmVtaXQocmVzdWx0KTtcclxuICAgICAgdGhpcy5yb3dEdXBsaWNhdGVkRXZlbnRFbWl0dGVyLmVtaXQocmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaFNvcnQoKSB7XHJcbiAgICBpZiAodGhpcy5lZGl0YWJsZVRhYmxlPy5zb3J0RmllbGQpIHtcclxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRGaWVsZDtcclxuICAgICAgY29uc3Qgc29ydE9yZGVyID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRPcmRlcjtcclxuXHJcbiAgICAgIHRoaXMuZ3JpZERhdGEuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQSA9IGFbc29ydEZpZWxkXTtcclxuICAgICAgICBjb25zdCB2YWx1ZUIgPSBiW3NvcnRGaWVsZF07XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmVzdWx0ID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAqIHNvcnRPcmRlcjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmdyaWREYXRhID0gWy4uLnRoaXMuZ3JpZERhdGFdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGVsZXRlKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkICYmIHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0TW9kZSkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkRGF0YS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLmlzRGlydHkgPSB0cnVlXHJcbiAgICAgIHRoaXMuX29uRGVsZXRlUm93KGl0ZW0pO1xyXG4gICAgICB0aGlzLnJvd0RlbGV0ZWRFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLl9jbGVhbkdyaWREYXRhRm9yRW1pdCgpKVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoU29ydCgpXHJcbiAgfVxyXG5cclxuICBnZXRTdW1tYXJ5KGNvbDogR3JpZENvbHVtbik6IG51bWJlciB7XHJcbiAgICBpZiAoY29sLmhhdmVTdW1tYXJ5ID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIHByZWNpc2VTdW0oKHRoaXMuZ3JpZERhdGEgPz8gW10pLm1hcCgocm93OiBhbnkpID0+IHJvd1tjb2wuZmllbGRdKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIHJvd1N1bW1hcnkocm93OiBhbnkpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHByZWNpc2VTdW0odGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnJvd1N1bW1hcnkgPT0gdHJ1ZSkubWFwKGNvbCA9PiByb3dbY29sLmZpZWxkXSkpO1xyXG4gIH1cclxuXHJcbiAgb25Sb3dTZWxlY3RlZChldmVudDogVGFibGVSb3dTZWxlY3RFdmVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy5fZjZTb3VyY2VSb3cgPSBudWxsO1xyXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ0R1cGxpY2F0ZUVtaXQoKTtcclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkgPT0gdHJ1ZSkge1xyXG4gICAgICBsZXQgc2VsZWN0aW9uS2V5OiBhbnk7XHJcbiAgICAgIHNlbGVjdGlvbktleSA9IHRoaXMuc2VsZWN0ZWRJdGVtW3RoaXMua2V5XTtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHNlbGVjdGlvbktleSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJvd1Vuc2VsZWN0KGV2ZW50OiBUYWJsZVJvd1VuU2VsZWN0RXZlbnQpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fZjZTb3VyY2VSb3cgPSBudWxsO1xyXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ0R1cGxpY2F0ZUVtaXQoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZShldmVudDogYW55KSB7XHJcblxyXG4gICAgbGV0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5KSB7XHJcbiAgICAgICAgICBsZXQga2V5czogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZvckVhY2goKHY6IGFueSkgPT4geyBrZXlzLnB1c2godlt0aGlzLmtleV0pIH0pO1xyXG4gICAgICAgICAgc2VsZWN0aW9uID0ga2V5cztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkSXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkSXRlbXMgPyBbdGhpcy5zZWxlY3RlZEl0ZW1zW3RoaXMua2V5XV0gOiBbXTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkSXRlbXMgPyBbdGhpcy5zZWxlY3RlZEl0ZW1zXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPSBHcmlkU2VsZWN0aW9uTW9kZS5Ob25lKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHNlbGVjdGlvbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5jb2RlID09PSAnU3BhY2UnKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdGNicpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX2Y2U291cmNlUm93ID8/IHRoaXMuc2VsZWN0ZWRJdGVtO1xyXG4gICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgaXNGaXJzdER1cGxpY2F0ZSA9ICF0aGlzLl9mNlNvdXJjZVJvdztcclxuICAgICAgdGhpcy5fZjZTb3VyY2VSb3cgPSBzb3VyY2U7XHJcblxyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmR1cGxpY2F0ZVJvdyhzb3VyY2UsIGlzRmlyc3REdXBsaWNhdGUsIHRydWUpO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdCAmJiAhdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVSZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVFbWl0VGltZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZUVtaXRUaW1lciA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVSZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMuYWRkZWRSb3dFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLl9wZW5kaW5nRHVwbGljYXRlUmVzdWx0KTtcclxuICAgICAgICAgIHRoaXMucm93RHVwbGljYXRlZEV2ZW50RW1pdHRlci5lbWl0KHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVSZXN1bHQpO1xyXG4gICAgICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAzMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Gb2N1c091dFJvdyhpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZm9jdXNPdXRSb3cuZW1pdChpdGVtKTtcclxuICB9XHJcblxyXG4gIGN1c3RvbVNvcnQoZXZlbnQ6IFNvcnRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCAmJiBldmVudC5kYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBldmVudC5kYXRhLnNvcnQoKGRhdGExLCBkYXRhMikgPT4ge1xyXG4gICAgICAgIGlmIChldmVudC5maWVsZCAhPSBudWxsICYmIGV2ZW50LmZpZWxkICE9IHVuZGVmaW5lZCAmJiBldmVudC5vcmRlcikge1xyXG4gICAgICAgICAgbGV0IHZhbHVlMSA9IGRhdGExW2V2ZW50LmZpZWxkXTtcclxuICAgICAgICAgIGxldCB2YWx1ZTIgPSBkYXRhMltldmVudC5maWVsZF07XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgcmVzdWx0ID0gMDtcclxuICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTEubG9jYWxlQ29tcGFyZSh2YWx1ZTIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXN1bHQgPSAodmFsdWUxIDwgdmFsdWUyKSA/IC0xIDogKHZhbHVlMSA+IHZhbHVlMikgPyAxIDogMDtcclxuXHJcbiAgICAgICAgICByZXR1cm4gKGV2ZW50Lm9yZGVyICogcmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3VsdChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNvbnN1bHRDbGlja2VkLmVtaXQoa2V5KTtcclxuICB9XHJcblxyXG4gIG9uQ2VsbExhYmVsUmVzb2x2ZWQoY29sOiBHcmlkQ29sdW1uLCBsYWJlbDogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGl0ZW1bdGhpcy5fZ2V0U2hhZG93U2VhcmNoQ29sdW1uTGFiZWwoY29sKV0gPSBsYWJlbDtcclxuICB9XHJcblxyXG4gIG9uQ2VsbFZhbHVlQ2hhbmdlZChjb2w6IEdyaWRDb2x1bW4sIG5ld1ZhbHVlOiBhbnksIGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgLy8gTWFyayB0aGUgZ3JpZCBpdHNlbGYgZGlydHkgb24gYW55IGdlbnVpbmUgY2VsbCBlZGl0LiBUaGUgZ3JpZCBpbnN0YW5jZSBsaXZlc1xyXG4gICAgLy8gZm9yIHRoZSB3aG9sZSBmb3JtIGxpZmV0aW1lLCBzbyB0aGlzIGZsYWcgc3Vydml2ZXMgcm93LWRhdGEgcmVhc3NpZ25tZW50XHJcbiAgICAvLyBkdXJpbmcgcmVjYWxjdWxhdGlvbiAod2hlcmUgdHJhbnNpZW50IGNlbGwgaW5wdXRzIGFyZSByZWNyZWF0ZWQgYW5kIGxvc2VcclxuICAgIC8vIHRoZWlyIG93biBpc0RpcnR5KSwga2VlcGluZyB0aGUgc2F2ZS10aW1lIGNoYW5nZSBkZXRlY3Rpb24gYWNjdXJhdGUuXHJcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xyXG4gICAgaWYgKGNvbC50eXBlID09PSBJbnB1dFR5cGVzLlNFQVJDSF9DT01CTyAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIGRlbGV0ZSBpdGVtW3RoaXMuX2dldFNoYWRvd1NlYXJjaENvbHVtbkxhYmVsKGNvbCldO1xyXG4gICAgfVxyXG4gICAgLy8gc2VuZCBldmVudHNcclxuICAgIGlmIChjb2wud2F0Y2hGb3JDaGFuZ2VzID09PSB0cnVlKSB7XHJcblxyXG4gICAgICBsZXQgY2VsbENoYW5nZWRSZXN1bHQ6IENlbGxDaGFuZ2VkUmVzdWx0ID0ge1xyXG4gICAgICAgIGtleTogaXRlbVt0aGlzLmtleV0sXHJcbiAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNlbGxDaGFuZ2VkLmVtaXQoY2VsbENoYW5nZWRSZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlY2FsY3VsYXRlIGN1cnJlbnRSb3dOdW1iZXJcclxuICAgIGlmIChjb2wuZmllbGQgPT09IHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCkge1xyXG4gICAgICB0aGlzLl9vcmRlckJ5Um93TnVtYmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZWQgcm93c1xyXG4gICAgLy8gaWYodGhpcy5fZXF1YWxpdHlDaGVja09uICYmIGNvbC5pc0VxdWF0YWJsZUNyaXRlcmlhKXtcclxuICAgIC8vICAgY29uc29sZS5sb2coJ2ZvdW5kIGVxdWF0YWJsZSA6IGNvbDonLCBjb2wsICdyb3cgOiAnLCBpdGVtKTtcclxuICAgIC8vICAgdGhpcy5fdHJ5RmluZEVxdWF0YWJsZShpdGVtKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlOiBGb3JtU3RhdGUpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZS51cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlKTtcclxuICB9XHJcblxyXG4gIGFwcGx5R2xvYmFsU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kdD8uZmlsdGVyR2xvYmFsKHRoaXMuc2VhcmNoVmFsdWUsIEVkaXRhYmxlR3JpZENvbXBvbmVudC5ERUNJTUFMX0FXQVJFX0NPTlRBSU5TX0ZJTFRFUik7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcblxyXG4gIHByaXZhdGUgX2luaXRSb3coKSB7XHJcbiAgICBsZXQgbmV3Um93OiBhbnkgPSB7fTtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUXHJcbiAgICAgICAgICB8fCBjb2wudHlwZSA9PSBJbnB1dFR5cGVzLlJBVEVfSU5QVVRcclxuICAgICAgICAgIHx8IGNvbC50eXBlID09IElucHV0VHlwZXMuSU5URUdFUlxyXG4gICAgICAgICAgfHwgY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUXHJcbiAgICAgICAgICB8fCBjb2wudHlwZSA9PSBJbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUKSB7XHJcbiAgICAgICAgICBuZXdSb3dbY29sLmZpZWxkXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbC50eXBlID09IElucHV0VHlwZXMuQ0hFQ0tCT1gpIHtcclxuICAgICAgICAgIG5ld1Jvd1tjb2wuZmllbGRdID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbmV3Um93W2NvbC5maWVsZF0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pc0F1dG9Sb3dOdW1iZXIgPT09IHRydWUpIHtcclxuICAgICAgICBuZXdSb3dbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXSA9IHRoaXMuX25leHRSb3dOdW1iZXIoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3Um93XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3Um93O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFNhdmVFdmVudFN1YnNjcmlwdGlvbigpIHtcclxuICAgIHRoaXMuc2F2ZUV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5zYXZlRXZlbnQ/LnN1YnNjcmliZShcclxuICAgICAgKCkgPT4gdGhpcy5zYXZlSXRlbXMoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZlcmlmeUdyaWRSZXF1aXJlbWVudHMoKSB7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zID09IG51bGxcclxuICAgICAgfHwgdGhpcy5jb2x1bW5zID09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyaWQgY29sdW1ucyBjYW5cXCd0IGJlIG51bGwnKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBsZXQgcm93TnVtYmVyQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzQXV0b1Jvd051bWJlckNvbHVtbiA9PT0gdHJ1ZSk7XHJcblxyXG4gICAgaWYgKHJvd051bWJlckNvbHVtbnMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyaWQgY29sdW1ucyBjYW5cXCd0IGhhdmUgbW9yZSB0aGFuIG9uZSBSb3dOdW1iZXJDb2x1bW4nKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAocm93TnVtYmVyQ29sdW1ucy5sZW5ndGggPT0gMSkge1xyXG4gICAgICB0aGlzLl9pc0F1dG9Sb3dOdW1iZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9hdXRvUm93TnVtYmVyRmllbGQgPSByb3dOdW1iZXJDb2x1bW5zWzBdLmZpZWxkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdEN1cnJlbnRSb3dOdW1iZXJBbmRPcmRlckJ5Um93TnVtYmVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzQXV0b1Jvd051bWJlciA9PT0gdHJ1ZVxyXG4gICAgICAmJiB0aGlzLl9hdXRvUm93TnVtYmVyRmllbGQgIT0gdW5kZWZpbmVkXHJcbiAgICAgICYmIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCAhPSBudWxsXHJcbiAgICAgICYmIHRoaXMuZ3JpZERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9vcmRlckJ5Um93TnVtYmVyKCk7XHJcblxyXG4gICAgICB0aGlzLl9jdXJyZW50Um93TnVtYmVyID0gdGhpcy5ncmlkRGF0YVt0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDFdW3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9uZXh0Um93TnVtYmVyKCk6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jdXJyZW50Um93TnVtYmVyID0gdGhpcy5ncmlkRGF0YS5sZW5ndGggKyAxO1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkRlbGV0ZVJvdyhyb3c6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHJvd1t0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdID09PSB0aGlzLl9jdXJyZW50Um93TnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXItLTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29yZGVyQnlSb3dOdW1iZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWREYXRhLnNvcnQoKGEsIGIpID0+IHsgcmV0dXJuIGFbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXSAtIGJbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXTsgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RXF1YXRhYmxlRmllbGRzKCk6IHZvaWQge1xyXG4gICAgbGV0IGVxdWF0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc0VxdWF0YWJsZUNyaXRlcmlhID09IHRydWUpO1xyXG4gICAgaWYgKGVxdWF0YWJsZUNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5fZXF1YWxpdHlDaGVja09uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fZXF1YXRhYmxlRmllbGRzID0gZXF1YXRhYmxlQ29sdW1ucy5tYXAoYyA9PiBjLmZpZWxkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRTdW1BdEZ1c2lvbkZpZWxkcygpOiB2b2lkIHtcclxuICAgIGxldCBzdW1BdEZ1c2lvbkNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc1N1bUF0RnVzaW9uID09IHRydWUpO1xyXG4gICAgaWYgKHN1bUF0RnVzaW9uQ29sdW1ucykge1xyXG4gICAgICB0aGlzLl9lcXVhbGl0eUNoZWNrT24gPSB0cnVlO1xyXG4gICAgICB0aGlzLl9zdW1BdEZ1c2lvbkZpZWxkcyA9IHN1bUF0RnVzaW9uQ29sdW1ucy5tYXAoYyA9PiBjLmZpZWxkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RyeUZpbmRFcXVhdGFibGUocm93OiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBmb3VuZEVxdWFsUm93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5ncmlkRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zb2xlLmxvZygncHJvYyByb3cgOiAnLCB0aGlzLmdyaWREYXRhW2ldKTtcclxuICAgICAgbGV0IGlzQ3VycmVudFJvd0VxdWFsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fZXF1YXRhYmxlRmllbGRzPy5mb3JFYWNoKGYgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdwcm9jIGZpZWxkIDogJywgZik7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZERhdGFbaV1bZl0gIT0gcm93W2ZdKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnbm90IGVxdWFsICcsIHJvdywgdGhpcy5ncmlkRGF0YVtpXSk7XHJcbiAgICAgICAgICBpc0N1cnJlbnRSb3dFcXVhbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpc0N1cnJlbnRSb3dFcXVhbCkge1xyXG4gICAgICAgIHRoaXMuX2Z1c2lvblJvd3ModGhpcy5ncmlkRGF0YVtpXSwgcm93KTtcclxuICAgICAgICBmb3VuZEVxdWFsUm93ID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGZvdW5kRXF1YWxSb3cpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2RlbGV0aW5nIDogJywgcm93KTtcclxuICAgICAgdGhpcy5kZWxldGUocm93KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Z1c2lvblJvd3Mocm93MTogYW55LCByb3cyOiBhbnkpIHtcclxuICAgIHRoaXMuX3N1bUF0RnVzaW9uRmllbGRzPy5mb3JFYWNoKGYgPT4ge1xyXG4gICAgICByb3cxW2ZdID0gcHJlY2lzZUFkZChyb3cxW2ZdLCByb3cyW2ZdKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuY2VsUGVuZGluZ0R1cGxpY2F0ZUVtaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wZW5kaW5nRHVwbGljYXRlUmVzdWx0ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKTtcclxuICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZUVtaXRUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zeW5jR2xvYmFsRmlsdGVyRmllbGRzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5zZWxlY3RlZENvbHVtbnMpIHtcclxuICAgICAgaWYgKGNvbC50eXBlID09PSBJbnB1dFR5cGVzLlNFQVJDSF9DT01CTykge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKHRoaXMuX2dldFNoYWRvd1NlYXJjaENvbHVtbkxhYmVsKGNvbCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzID0gZmllbGRzO1xyXG4gIH1cclxuICBcclxuICBwcml2YXRlIF9yZWdpc3RlckdyaWRDb250YWluc0ZpbHRlcigpOiB2b2lkIHtcclxuICAgIC8vIEN1c3RvbSBQcmltZU5HIGZpbHRlciB1c2VkIGJ5IGFwcGx5R2xvYmFsU2VhcmNoKCkgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gJ2NvbnRhaW5zJy5cclxuICAgIC8vIEV4dGVuZHMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHdpdGggbG9jYWxlLWF3YXJlIGRlY2ltYWwgbWF0Y2hpbmc6XHJcbiAgICAvLyBhIHVzZXIgaW4gRlIvQVIgbG9jYWxlIHR5cGVzIFwiMTEsMjVcIiBidXQgdGhlIHN0b3JlZCBKUyBudW1iZXIgc3RyaW5naWZpZXMgYXMgXCIxMS4yNVwiLFxyXG4gICAgLy8gc28gYSBwbGFpbiAnY29udGFpbnMnIGNoZWNrIHdvdWxkIG1pc3MgaXQuXHJcbiAgICB0aGlzLl9maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKEVkaXRhYmxlR3JpZENvbXBvbmVudC5ERUNJTUFMX0FXQVJFX0NPTlRBSU5TX0ZJTFRFUiwgKHZhbHVlOiBhbnksIGZpbHRlcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIudHJpbSgpID09PSAnJykgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3Qgc3RyRmlsdGVyID0gZmlsdGVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgLy8gU3RlcCAxIOKAlCBkaXJlY3QgbWF0Y2ggKGhhbmRsZXMgYWxsIHRleHQgY29sdW1ucyBhbmQgZXhhY3QgbnVtZXJpYyBtYXRjaGVzKVxyXG4gICAgICBpZiAoc3RyVmFsdWUuaW5jbHVkZXMoc3RyRmlsdGVyKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAvLyBTdGVwIDIg4oCUIGRlY2ltYWwgY29tbWHihpRkb3Qgbm9ybWFsaXphdGlvbi5cclxuICAgICAgLy8gVHdvIGd1YXJkcyBtdXN0IGJvdGggcGFzcyBiZWZvcmUgbm9ybWFsaXppbmc6XHJcbiAgICAgIC8vICAg4oCiIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgIOKGkiBvbmx5IHJ1biBvbiBhY3R1YWwgbnVtZXJpYyB2YWx1ZXM7IHRleHQgY29sdW1uc1xyXG4gICAgICAvLyAgICAgY29udGFpbmluZyBkb3RzIChlLmcuIHByb2R1Y3QgY29kZXMgbGlrZSBcIkhQLlhZWlwiKSBhcmUgbmV2ZXIgdG91Y2hlZC5cclxuICAgICAgLy8gICDigKIgL15cXGQrWywuXVxcZCskLyAgICAgICAgICAgIOKGkiBmaWx0ZXIgbXVzdCBsb29rIGxpa2UgYSBkZWNpbWFsIG51bWJlcjpcclxuICAgICAgLy8gICAgICAgXlxcZCsgICBvbmUgb3IgbW9yZSBkaWdpdHMgYmVmb3JlIHRoZSBzZXBhcmF0b3JcclxuICAgICAgLy8gICAgICAgWywuXSAgIGV4YWN0bHkgb25lIHNlcGFyYXRvciwgY29tbWEgb3IgZG90XHJcbiAgICAgIC8vICAgICAgIFxcZCskICAgb25lIG9yIG1vcmUgZGlnaXRzIGFmdGVyIHRoZSBzZXBhcmF0b3JcclxuICAgICAgLy8gICAgIFRoaXMgcmVqZWN0cyBmcmVlLXRleHQgZmlsdGVycyB0aGF0IGhhcHBlbiB0byBjb250YWluIGEgY29tbWEgKFwiQ2Fpc3NlLCBGcmFuY2VcIilcclxuICAgICAgLy8gICAgIGFuZCBpbmNvbXBsZXRlIGlucHV0cyAoXCIxMSxcIiAvIFwiLDI1XCIpLlxyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAvXlxcZCtbLC5dXFxkKyQvLnRlc3Qoc3RyRmlsdGVyKSkge1xyXG4gICAgICAgIHJldHVybiBzdHJWYWx1ZS5pbmNsdWRlcyhzdHJGaWx0ZXIucmVwbGFjZSgnLCcsICcuJykpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFuR3JpZERhdGFGb3JFbWl0KCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhLm1hcChyb3cgPT4ge1xyXG4gICAgICBjb25zdCBjbGVhbjogYW55ID0ge307XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdykpIHtcclxuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKEVkaXRhYmxlR3JpZENvbXBvbmVudC5TRUFSQ0hfTEFCRUxfUFJFRklYKSkge1xyXG4gICAgICAgICAgY2xlYW5ba2V5XSA9IHJvd1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY2xlYW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFNoYWRvd1NlYXJjaENvbHVtbkxhYmVsKGNvbHVtbjogR3JpZENvbHVtbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7RWRpdGFibGVHcmlkQ29tcG9uZW50LlNFQVJDSF9MQUJFTF9QUkVGSVh9JHtjb2x1bW4uZmllbGR9YDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICA8cC10YWJsZSAjZHQgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCIgZWRpdE1vZGU9XCJyb3dcIlxyXG4gICAgW3BhZ2luYXRvcl09XCJncmlkRGF0YS5sZW5ndGggPiBwYWdlU2l6ZVwiIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicm93UGVyUGFnZVwiIFtyb3dzXT1cInBhZ2VTaXplXCJcclxuICAgIChvblJvd1NlbGVjdCk9XCJvblJvd1NlbGVjdGVkKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJvblJvd1Vuc2VsZWN0KCRldmVudClcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgIChvbkNvbFJlc2l6ZSk9XCJvbkNvbFJlc2l6ZSgkZXZlbnQpXCJcclxuICAgIFtyZXNpemFibGVDb2x1bW5zXT1cInRydWVcIiBjb2x1bW5SZXNpemVNb2RlPVwiZXhwYW5kXCIgYXBwZW5kVG89XCJib2R5XCIgW3ZhbHVlXT1cImdyaWREYXRhXCJcclxuICAgIFtjb2x1bW5zXT1cInNlbGVjdGVkQ29sdW1uc1wiIFtkYXRhS2V5XT1cImtleVwiIFtzY3JvbGxIZWlnaHRdPVwic2Nyb2xsSGVpZ2h0XCIgW3N0eWxlQ2xhc3NdPVwiJ3AtZGF0YXRhYmxlLXNtIHAtZGF0YXRhYmxlLWdyaWRsaW5lcycgKyAoc3RyaXBlZFJvd3MgPyAnIHAtZGF0YXRhYmxlLXN0cmlwZWQnIDogJycpXCJcclxuICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIiAjZWRpdGFibGVUYWJsZSBbdG90YWxSZWNvcmRzXT1cImdyaWREYXRhLmxlbmd0aFwiXHJcbiAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlckZpZWxkc1wiIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnlcIiBbdGFibGVTdHlsZV09XCJ0YWJsZVN0eWxlXCI+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC01IGZsZXgtcm93XCI+XHJcbiAgICAgICAgPHAtbXVsdGlTZWxlY3QgW29wdGlvbnNdPVwiY29sdW1uc1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW5zXCJcclxuICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSB7eyAnY29sdW1uc19zZWxlY3RlZCcgfCBsb2NhbGl6ZSB9fVwiIG9wdGlvbkxhYmVsPVwidHJhbnNsYXRlZEhlYWRlclwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieydtaW4td2lkdGgnOiAnMTgwcHgnfVwiIHBsYWNlaG9sZGVyPVwie3sgJ2Nob29zZV9jb2x1bW5zJyB8IGxvY2FsaXplIH19XCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LW9wdGlvbiBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IG9wdGlvbi5oZWFkZXIgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHbG9iYWxTZWFyY2hcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHctOFwiPlxyXG4gICAgICAgICAgPGRpdiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJnbG9iYWxfc2VhcmNoXCIgY2xhc3M9XCJwLWlucHV0Z3JvdXAgcnRsLW1vZGUgaC0ycmVtIG5vLXBhZFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJcIiB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIiBwSW5wdXRUZXh0IGNsYXNzPVwiYm9yZGVyLXJvdW5kLWxnXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ3NoYXJlZF9lZGl0dGFibGVfc2VhcmNoX3BsYWNlaG9sZGVyJyB8IGxvY2FsaXplXCIgKGtleWRvd24uZW50ZXIpPVwiYXBwbHlHbG9iYWxTZWFyY2goKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cInNlYXJjaF9idXR0b25cIj5cclxuICAgICAgICAgICAgPFRzaS1CdXR0b24gc3R5bGVDbGFzcz1cInAtYnV0dG9uLWljb24tb25seVwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfc2VhcmNoXCJcclxuICAgICAgICAgICAgICAob25DbGljayk9XCJhcHBseUdsb2JhbFNlYXJjaCgpXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj4gXHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuXHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uTW9kZSAhPSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uIHN0eWxlPVwibWluLXdpZHRoOjJyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6MnJlbSAhaW1wb3J0YW50O1wiPjwvdGg+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6MnJlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDoycmVtICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIFxyXG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGg+XHJcblxyXG4gICAgICAgIDwhLS0gPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD4gLS0+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEdXBsaWNhdGVCdXR0b25cIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93Q29uc3VsdEJ1dHRvblwiIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGg+XHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG5cclxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiY29sLmlzRnJvemVuXCIgW3N0eWxlXT1cImNvbC5zdHlsZVwiIFtuZ1N0eWxlXT1cImdldENvbHVtblNpemVTdHlsZShjb2wpXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgW2F0dHIuZGF0YS1maWVsZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgW2NsYXNzLnRzaS1jb2wtd3JhcF09XCJzaG91bGRXcmFwQ29sdW1uKGNvbClcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTtcIiBwU29ydGFibGVDb2x1bW49XCJ7e2NvbC5maWVsZH19XCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgIHBUb29sdGlwPVwie3tjb2wudG9vbFRpcFRleHQgfCBsb2NhbGl6ZSB9fVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHBSZW9yZGVyYWJsZUNvbHVtbj57eyBjb2wuaGVhZGVyIHwgbG9jYWxpemVcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInt7Y29sLmZpZWxkfX1cIj48L3Atc29ydEljb24+XHJcbiAgICAgICAgICA8VHNpLUJ1YmJsZS1JbmZvIFtpbmZvVGV4dF09XCJjb2wuaW5mb1RleHQgfCBsb2NhbGl6ZVwiPjwvVHNpLUJ1YmJsZS1JbmZvPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoIHN0eWxlPVwibWluLXdpZHRoOjNyZW1cIiAqbmdJZj1cInNob3dSb3dTdW1tYXJ5XCIgc2NvcGU9XCJjb2xcIj57eydSb3dTdW1tYXJ5JyB8IGxvY2FsaXplfX08L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1pdGVtIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgIFxyXG4gICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJpdGVtXCJcclxuICAgICAgICAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09IHVuZGVmaW5lZDsgZWxzZSBzZWxlY3Rpb25Nb2RlQmxvY2tcIlxyXG4gICAgICAgIChmb2N1c091dCk9XCJvbkZvY3VzT3V0Um93KGl0ZW0pXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCIgPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPiAtLT5cclxuXHJcblxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICA8L3RkPiAtLT5cclxuXHJcbiAgICAgICAgPCEtLSA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLWNoZWNrXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIC1tbC0xXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93IGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIC1tbC0yXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RkPlxyXG5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEdXBsaWNhdGVCdXR0b25cIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICA8VHNpLUJ1dHRvbiBbYnV0dG9uVHlwZV09XCJidXR0b25UeXBlLkJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWNvcHlcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9kdXBsaXF1ZXJcIlxyXG4gICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24taW5mb1wiIChjbGljayk9XCJkdXBsaWNhdGVSb3coaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgc3R5bGU9XCJsZWZ0OiAtMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1jb25zdWx0LXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtidXR0b25UeXBlXT1cImJ1dHRvblR5cGUuQnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktZXllXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfY29uc3VsdGVyXCJcclxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiIChjbGljayk9XCJjb25zdWx0KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCJcclxuICAgICAgICAgIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1kZWxldGUtc3R5bGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICAgICAgPFRzaS1CdXR0b24gW2Rpc2FibGVkXT1cImlzRGVsZXRlQnV0dG9uRGlzYWJsZWQoaXRlbSlcIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9zdXBwcmltZXJcIlxyXG4gICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG5cclxuXHJcbiAgICAgICAgPHRkIGNsYXNzPVwidWktcmVzaXphYmxlLWNvbHVtblwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJjb2wuaXNGcm96ZW5cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgW2NsYXNzLnRzaS1jb2wtd3JhcF09XCJzaG91bGRXcmFwQ29sdW1uKGNvbClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Qm9keUNvbHVtblN0eWxlKGNvbClcIj5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmRpc3BsYXlPbmx5IHx8IGRpc2FibGVkOyBlbHNlIG9yZGluYXJ5QmxvY1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVNlYXJjaC1Db21ibyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlNFQVJDSF9DT01CTzsgZWxzZSBjdXJyZW5jeVNvY2lldGVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbZGlzYWJsZWRdPVwidHJ1ZVwiIFtlbGVtZW50U291cmNlVXJsXT1cImNvbC5lbGVtZW50U291cmNlVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICBbYnVzaW5lc3NDbGFzc109XCJjb2wuYnVzaW5lc3NDbGFzc1wiIFtjdXJyZW50Um93SXRlbV09XCJpdGVtXCIgWyhiaW5kKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCIgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzRmlsdGVyZWRdPVwiY29sLmlzRmlsdGVyZWRcIiBbZGF0YXNvdXJjZV09XCJjb2wuZGF0YXNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWFyY2hCdXR0b25dPVwiY29sLnNob3dTZWFyY2hCdXR0b24gPz8gdHJ1ZVwiIFtzaG93QWRkQnV0dG9uXT1cImNvbC5zaG93QWRkQnV0dG9uID8/IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93VXBkYXRlQnV0dG9uXT1cImNvbC5zaG93VXBkYXRlQnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDb25zdWx0QnV0dG9uXT1cImNvbC5zaG93Q29uc3VsdEJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTGFiZWxDaGFuZ2UpPVwib25DZWxsTGFiZWxSZXNvbHZlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRBVEU7IGVsc2UgY2hlY2tCb3hPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtzaG93VGltZV09XCJjb2wuc2hvd1RpbWVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94LURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ2hlY2tib3gtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrYm94LURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREVDSU1BTF9JTlBVVDsgZWxzZSBpbnRlZ2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5JTlRFR0VSOyBlbHNlIHJhdGVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlJBVEVfSU5QVVQ7IGVsc2UgdGltZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb25cIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGltZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FOyBlbHNlIGZvcm11bGFPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0c2ktdGltZS1kaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+PC90c2ktdGltZS1kaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRm9ybXVsYS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkZPUk1VTEFfVEVYVF9CT1g7IGVsc2UgZGVmYXVsdFRleHRPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRm9ybXVsYS1Cb3ggW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgWyh2YWx1ZSldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPjwvVHNpLUZvcm11bGEtQm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bY29sLmZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI29yZGluYXJ5QmxvYz5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVNlYXJjaC1Db21ibyAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbZWxlbWVudFNvdXJjZVVybF09XCJjb2wuZWxlbWVudFNvdXJjZVVybFwiXHJcbiAgICAgICAgICAgICAgICBbYnVzaW5lc3NDbGFzc109XCJjb2wuYnVzaW5lc3NDbGFzc1wiIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgWyhiaW5kKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgaWQtZmllbGQ9XCJ7e2NvbC5pZEZpZWxkfX1cIiBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCJcclxuICAgICAgICAgICAgICAgIFtjdXJyZW50Um93SXRlbV09XCJpdGVtXCIgKGJpbmRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIiBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtzaG93QWRkQnV0dG9uXT1cImNvbC5zaG93QWRkQnV0dG9uID8/IHRydWVcIiBbc2hvd1VwZGF0ZUJ1dHRvbl09XCJjb2wuc2hvd1VwZGF0ZUJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dDb25zdWx0QnV0dG9uXT1cImNvbC5zaG93Q29uc3VsdEJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgIChzZWxlY3RlZExhYmVsQ2hhbmdlKT1cIm9uQ2VsbExhYmVsUmVzb2x2ZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9JTlBVVDsgZWxzZSBjdXJyZW5jeU90aGVySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkYXRlUGlja2VySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5EQVRFOyBlbHNlIGNoZWNrQm94SW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1EYXRlLVBpY2tlciBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbc2hvd1RpbWVdPVwiY29sLnNob3dUaW1lXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1QaWNrZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ0hFQ0tCT1g7IGVsc2UgZGVjaW1hbElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQ2hlY2tCb3ggW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiIFxyXG4gICAgICAgICAgICAgICAgICBbaXNCaW5hcnldPVwiY29sLmlzQmluYXJ5ID8/IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREVDSU1BTF9JTlBVVDsgZWxzZSBpbnRlZ2VySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVJbnB1dEJsb2NcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLUlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktVGltZS1waWNrZXIgYmxvYyAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aW1lSW5wdXRCbG9jPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlRJTUU7IGVsc2UgZm9ybXVsYUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDx0c2ktdGltZS1waWNrZXIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC90c2ktdGltZS1waWNrZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Zvcm11bGFJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkZPUk1VTEFfVEVYVF9CT1g7IGVsc2UgZGVmYXVsdFRleHRJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tPFRzaS1CdWJibGUtSW5mb1xyXG4gICAgICAgICAgICAgICAgICBbaW5mb1RleHRdPVwiWydmb3JtdWxhX2V4cGxpY2F0aW9uJyxcclxuICAgICAgICAgICAgICAgICAgXVwiPjwvVHNpLUJ1YmJsZS1JbmZvPiAtLT5cclxuICAgICAgICAgICAgICAgIDxUc2ktRm9ybXVsYS1Cb3ggW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgWyh2YWx1ZSldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+PC9Uc2ktRm9ybXVsYS1Cb3g+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxUc2ktVGV4dC1Cb3ggW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICA8dGQgKm5nSWY9XCJzaG93Um93U3VtbWFyeVwiIGNsYXNzPVwiZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICB7e3Jvd1N1bW1hcnkoaXRlbSl9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGlvbk1vZGVCbG9jaz5cclxuICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiaXRlbVwiIFtwU2VsZWN0YWJsZVJvd109XCJpdGVtXCIgW3BTZWxlY3RhYmxlUm93SW5kZXhdPVwicm93SW5kZXhcIlxyXG4gICAgICAgICAgICAoZm9jdXNPdXQpPVwib25Gb2N1c091dFJvdyhpdGVtKVwiPlxyXG5cclxuICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPiAtLT5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gPHRkICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCIgc3R5bGU9XCJ3aWR0aDogMnJlbTtcIj5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICN0YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3RkPiAtLT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07bGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93IGljb249XCJwaSBwaS1wZW5jaWxcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktY2hlY2tcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIC1tbC0xXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXRpbWVzXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIC1tbC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dIYXZlU3VtYXJ5XCIgc2NvcGU9XCJjb2xcIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cInNob3dEdXBsaWNhdGVCdXR0b25cIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbYnV0dG9uVHlwZV09XCJidXR0b25UeXBlLkJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWNvcHlcIlxyXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfZHVwbGlxdWVyXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1pbmZvXCIgKGNsaWNrKT1cImR1cGxpY2F0ZVJvdyhpdGVtKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uIHBSZXNpemFibGVDb2x1bW4gKm5nSWY9XCJzaG93Q29uc3VsdEJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMSBidG4tY29uc3VsdC1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtidXR0b25UeXBlXT1cImJ1dHRvblR5cGUuQnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktZXllXCJcclxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgdG9vbHRpcFRleHQ9XCJzaGFyZWRfZWRpdHRhYmxlX2NvbnN1bHRlclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNvbnN1bHQoaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBwUmVzaXphYmxlQ29sdW1uICpuZ0lmPVwic2hvd0RlbGV0ZUJ1dHRvblwiIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtMSBidG4tZGVsZXRlLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLXRyYXNoXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcFRleHQ9XCJzaGFyZWRfZWRpdHRhYmxlX3N1cHByaW1lclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidWktcmVzaXphYmxlLWNvbHVtblwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJjb2wuaXNGcm96ZW5cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy50c2ktY29sLXdyYXBdPVwic2hvdWxkV3JhcENvbHVtbihjb2wpXCIgW25nU3R5bGVdPVwiZ2V0Qm9keUNvbHVtblN0eWxlKGNvbClcIj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5kaXNwbGF5T25seSB8fCBkaXNhYmxlZDsgZWxzZSBvcmRpbmFyeUJsb2NcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVNlYXJjaC1Db21ibyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlNFQVJDSF9DT01CTzsgZWxzZSBjdXJyZW5jeVNvY2lldGVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbZGlzYWJsZWRdPVwidHJ1ZVwiIFtlbGVtZW50U291cmNlVXJsXT1cImNvbC5lbGVtZW50U291cmNlVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICBbYnVzaW5lc3NDbGFzc109XCJjb2wuYnVzaW5lc3NDbGFzc1wiIFtjdXJyZW50Um93SXRlbV09XCJpdGVtXCIgWyhiaW5kKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCIgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzRmlsdGVyZWRdPVwiY29sLmlzRmlsdGVyZWRcIiBbZGF0YXNvdXJjZV09XCJjb2wuZGF0YXNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWFyY2hCdXR0b25dPVwiY29sLnNob3dTZWFyY2hCdXR0b24gPz8gdHJ1ZVwiIFtzaG93QWRkQnV0dG9uXT1cImNvbC5zaG93QWRkQnV0dG9uID8/IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93VXBkYXRlQnV0dG9uXT1cImNvbC5zaG93VXBkYXRlQnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDb25zdWx0QnV0dG9uXT1cImNvbC5zaG93Q29uc3VsdEJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTGFiZWxDaGFuZ2UpPVwib25DZWxsTGFiZWxSZXNvbHZlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRBVEU7IGVsc2UgY2hlY2tCb3hPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtzaG93VGltZV09XCJjb2wuc2hvd1RpbWVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94LURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ2hlY2tib3gtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrYm94LURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREVDSU1BTF9JTlBVVDsgZWxzZSBpbnRlZ2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5JTlRFR0VSOyBlbHNlIHJhdGVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlJBVEVfSU5QVVQ7IGVsc2UgdGltZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb25cIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGltZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FOyBlbHNlIGZvcm11bGFPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0c2ktdGltZS1kaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+PC90c2ktdGltZS1kaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRm9ybXVsYS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkZPUk1VTEFfVEVYVF9CT1g7IGVsc2UgZGVmYXVsdFRleHRPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRm9ybXVsYS1Cb3ggW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgWyh2YWx1ZSldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPjwvVHNpLUZvcm11bGEtQm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bY29sLmZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNvcmRpbmFyeUJsb2M+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5TRUFSQ0hfQ09NQk87IGVsc2UgY3VycmVuY3lTb2NpZXRlSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbZWxlbWVudFNvdXJjZVVybF09XCJjb2wuZWxlbWVudFNvdXJjZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBbKGJpbmQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChiaW5kQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCIgW3Nob3dBZGRCdXR0b25dPVwiY29sLnNob3dBZGRCdXR0b24gPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dVcGRhdGVCdXR0b25dPVwiY29sLnNob3dVcGRhdGVCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbnN1bHRCdXR0b25dPVwiY29sLnNob3dDb25zdWx0QnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRMYWJlbENoYW5nZSk9XCJvbkNlbGxMYWJlbFJlc29sdmVkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCI+PC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lTb2NpZXRlSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9JTlBVVDsgZWxzZSBjdXJyZW5jeU90aGVySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfSU5QVVQ7IGVsc2UgZGF0ZVBpY2tlcklucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIiBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRBVEU7IGVsc2UgY2hlY2tCb3hJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLVBpY2tlciBbc2hvd1RpbWVdPVwiY29sLnNob3dUaW1lXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtUGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3ggLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94SW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ0hFQ0tCT1g7IGVsc2UgZGVjaW1hbElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lzQmluYXJ5XT1cImNvbC5pc0JpbmFyeSA/PyBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrQm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlcklucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbY2xhc3NdPVwiJ21heC13LTRyZW0nXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1SYXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuUkFURV9JTlBVVDsgZWxzZSB0aW1lSW5wdXRCbG9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktVGltZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVJbnB1dEJsb2M+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlRJTUUgZWxzZSBmb3JtdWxhSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0c2ktdGltZS1waWNrZXIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90c2ktdGltZS1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Zvcm11bGFJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5GT1JNVUxBX1RFWFRfQk9YOyBlbHNlIGRlZmF1bHRUZXh0SW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRm9ybXVsYS1Cb3ggW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgWyh2YWx1ZSldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPjwvVHNpLUZvcm11bGEtQm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0SW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLVRleHQtQm94IFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJzaG93Um93U3VtbWFyeVwiIGNsYXNzPVwiZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICAgICAge3tyb3dTdW1tYXJ5KGl0ZW0pfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHBUZW1wbGF0ZT1cImZvb3RlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgPHRyIGNsYXNzPVwidGZvb3RlclwiPlxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc2NvcGU9XCJjb2xcIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGQ+IC0tPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDoycmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjJyZW0gIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzY29wZT1cImNvbFwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPlRvdGFsPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgPCEtLTx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0VkaXRCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RHVwbGljYXRlQnV0dG9uXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBbbmdTdHlsZV09XCJnZXRDb2x1bW5TaXplU3R5bGUoY29sKVwiIHNjb3BlPVwiY29sXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgIFtjbGFzcy50c2ktY29sLXdyYXBdPVwic2hvdWxkV3JhcENvbHVtbihjb2wpXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmhhdmVTdW1tYXJ5XCI+XHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9JTlBVVDsgZWxzZSBjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sKVwiPlxyXG4gICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5T3RoZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRGVmYXVsdCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAge3tnZXRTdW1tYXJ5KGNvbCl9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIHt7J1RvdGFsUmVjb3Jkc0NvdW50JyB8IGxvY2FsaXplIH19IHt7Z3JpZERhdGEubGVuZ3RofX1cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLXRhYmxlPlxyXG4gIDxkaXY+XHJcbiAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIiBzdHlsZT1cImhlaWdodDogMjBweDt3aWR0aDogMjBweDtcIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1wbHVzXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9ham91dGVyXCJcclxuICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1zdWNjZXNzIHAtYnV0dG9uLXRleHQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5IG5nLXN0YXItaW5zZXJ0ZWRcIlxyXG4gICAgICAoY2xpY2spPVwiYWRkUm93KClcIj48L1RzaS1CdXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|