@hitsoft/kadooglu.kalite 0.0.0-stage → 1.0.1
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/README.md +23 -2
- package/config/enums/index.d.ts +1 -0
- package/config/enums/route-names.d.ts +5 -0
- package/config/index.d.ts +5 -0
- package/config/kalite-config.module.d.ts +8 -0
- package/config/providers/index.d.ts +1 -0
- package/config/providers/route.provider.d.ts +4 -0
- package/config/public-api.d.ts +3 -0
- package/esm2020/config/enums/index.mjs +2 -0
- package/esm2020/config/enums/route-names.mjs +2 -0
- package/esm2020/config/hitsoft-kadooglu.kalite-config.mjs +5 -0
- package/esm2020/config/kalite-config.module.mjs +18 -0
- package/esm2020/config/providers/index.mjs +2 -0
- package/esm2020/config/providers/route.provider.mjs +57 -0
- package/esm2020/config/public-api.mjs +4 -0
- package/esm2020/hitsoft-kadooglu.kalite.mjs +5 -0
- package/esm2020/lib/components/intake-form.component.mjs +162 -0
- package/esm2020/lib/components/intake-list.component.mjs +80 -0
- package/esm2020/lib/components/kalite.component.mjs +18 -0
- package/esm2020/lib/components/process-analysis.component.mjs +197 -0
- package/esm2020/lib/components/quality-definitions.component.mjs +97 -0
- package/esm2020/lib/components/quality-notifications.component.mjs +64 -0
- package/esm2020/lib/components/quality-parameters.component.mjs +332 -0
- package/esm2020/lib/components/quality-reports.component.mjs +107 -0
- package/esm2020/lib/kalite-notification.module.mjs +23 -0
- package/esm2020/lib/kalite-routing.module.mjs +41 -0
- package/esm2020/lib/kalite.module.mjs +41 -0
- package/esm2020/lib/models/intake.models.mjs +2 -0
- package/esm2020/lib/models/quality.models.mjs +2 -0
- package/esm2020/lib/services/kalite.service.mjs +21 -0
- package/esm2020/lib/services/print-form.mjs +96 -0
- package/esm2020/lib/services/quality-api.service.mjs +119 -0
- package/esm2020/lib/services/quality-measurements.mjs +127 -0
- package/esm2020/public-api.mjs +16 -0
- package/fesm2015/hitsoft-kadooglu.kalite-config.mjs +80 -0
- package/fesm2015/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
- package/fesm2015/hitsoft-kadooglu.kalite.mjs +1483 -0
- package/fesm2015/hitsoft-kadooglu.kalite.mjs.map +1 -0
- package/fesm2020/hitsoft-kadooglu.kalite-config.mjs +80 -0
- package/fesm2020/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
- package/fesm2020/hitsoft-kadooglu.kalite.mjs +1442 -0
- package/fesm2020/hitsoft-kadooglu.kalite.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/intake-form.component.d.ts +50 -0
- package/lib/components/intake-list.component.d.ts +48 -0
- package/lib/components/kalite.component.d.ts +10 -0
- package/lib/components/process-analysis.component.d.ts +46 -0
- package/lib/components/quality-definitions.component.d.ts +46 -0
- package/lib/components/quality-notifications.component.d.ts +44 -0
- package/lib/components/quality-parameters.component.d.ts +82 -0
- package/lib/components/quality-reports.component.d.ts +31 -0
- package/lib/kalite-notification.module.d.ts +14 -0
- package/lib/kalite-routing.module.d.ts +7 -0
- package/lib/kalite.module.d.ts +23 -0
- package/lib/models/intake.models.d.ts +185 -0
- package/lib/models/quality.models.d.ts +114 -0
- package/lib/services/kalite.service.d.ts +10 -0
- package/lib/services/print-form.d.ts +2 -0
- package/lib/services/quality-api.service.d.ts +71 -0
- package/lib/services/quality-measurements.d.ts +8 -0
- package/package.json +42 -3
- package/public-api.d.ts +12 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import CustomStore from 'devextreme/data/custom_store';
|
|
3
|
+
import { firstValueFrom } from 'rxjs';
|
|
4
|
+
import { download, errorMessage, statusLabel } from '../services/quality-measurements';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../services/quality-api.service";
|
|
7
|
+
import * as i2 from "@abp/ng.core";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i4 from "@angular/forms";
|
|
10
|
+
import * as i5 from "@angular/router";
|
|
11
|
+
import * as i6 from "@abp/ng.theme.shared";
|
|
12
|
+
import * as i7 from "devextreme-angular";
|
|
13
|
+
import * as i8 from "devextreme-angular/ui/nested";
|
|
14
|
+
import * as i9 from "devextreme-angular/core";
|
|
15
|
+
import * as i10 from "@ng-bootstrap/ng-bootstrap";
|
|
16
|
+
export class IntakeListComponent {
|
|
17
|
+
constructor(api, permissions) {
|
|
18
|
+
this.api = api;
|
|
19
|
+
this.permissions = permissions;
|
|
20
|
+
this.statuses = [{ value: 'Waiting', text: 'Bekliyor' }, { value: 'Draft', text: 'Taslak' }, { value: 'Accepted', text: 'Kabul' }, { value: 'Rejected', text: 'Ret' }];
|
|
21
|
+
this.dataSource = new CustomStore({ key: 'docEntry', load: async (options) => {
|
|
22
|
+
this.error = '';
|
|
23
|
+
try {
|
|
24
|
+
const result = await firstValueFrom(this.api.intakeList({ ...this.query, search: String(options.searchValue || ''),
|
|
25
|
+
skipCount: options.skip || 0, maxResultCount: options.take || 20,
|
|
26
|
+
filter: options.filter ? JSON.stringify(options.filter) : '', sort: options.sort ? JSON.stringify(options.sort) : '' }));
|
|
27
|
+
this.rows = result.items;
|
|
28
|
+
this.total = result.totalCount;
|
|
29
|
+
return { data: result.items, totalCount: result.totalCount };
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
this.error = errorMessage(e);
|
|
33
|
+
throw new Error(this.error);
|
|
34
|
+
}
|
|
35
|
+
} });
|
|
36
|
+
this.rows = [];
|
|
37
|
+
this.types = [];
|
|
38
|
+
this.total = 0;
|
|
39
|
+
this.busy = false;
|
|
40
|
+
this.error = '';
|
|
41
|
+
this.query = { pendingOnly: true, from: '', until: '', search: '', movementTypeCode: '', status: '', skipCount: 0, maxResultCount: 20 };
|
|
42
|
+
this.cancelRow = null;
|
|
43
|
+
this.reason = '';
|
|
44
|
+
this.statusLabel = statusLabel;
|
|
45
|
+
}
|
|
46
|
+
ngOnInit() { this.api.qualityMovementTypes().subscribe({ next: types => this.types = types, error: e => this.error = errorMessage(e) }); this.load(); }
|
|
47
|
+
allowed(policy) { return this.permissions.getGrantedPolicy('Kalite.Intake.' + policy); }
|
|
48
|
+
editable(row) { return row.vehicleStatus === '0' && !row.firstWeight && !row.hasExited; }
|
|
49
|
+
load(reset = false) {
|
|
50
|
+
this.busy = false;
|
|
51
|
+
if (reset)
|
|
52
|
+
this.grid?.instance.pageIndex(0);
|
|
53
|
+
this.grid?.instance.refresh();
|
|
54
|
+
}
|
|
55
|
+
tab(pending) { this.query.pendingOnly = pending; this.load(true); }
|
|
56
|
+
page(direction) { this.query.skipCount += direction * this.query.maxResultCount; this.load(); }
|
|
57
|
+
get pageNumber() { return Math.floor(this.query.skipCount / this.query.maxResultCount) + 1; }
|
|
58
|
+
print(row) { this.api.intakePdf(row.docEntry).subscribe({ next: blob => download(blob, `Girdi-Kontrol-${row.docEntry}.pdf`), error: e => this.error = errorMessage(e) }); }
|
|
59
|
+
cancel() {
|
|
60
|
+
if (!this.cancelRow || !this.reason.trim()) {
|
|
61
|
+
this.error = 'İptal gerekçesi girin.';
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.busy = true;
|
|
65
|
+
const id = this.cancelRow.docEntry;
|
|
66
|
+
this.api.intake(id).subscribe({ next: form => this.api.cancelIntake(id, form.inspection.revision, this.reason).subscribe({
|
|
67
|
+
next: () => { this.cancelRow = null; this.reason = ''; this.load(); }, error: e => { this.error = errorMessage(e); this.busy = false; }
|
|
68
|
+
}), error: e => { this.error = errorMessage(e); this.busy = false; } });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
IntakeListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IntakeListComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
72
|
+
IntakeListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: IntakeListComponent, selector: "lib-intake-list", viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true }], ngImport: i0, template: "<div class=\"container-fluid\"><h3>Ham Ya\u011F Giri\u015F Kalite Kontrol</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-success]=\"query.pendingOnly\" [class.btn-outline-secondary]=\"!query.pendingOnly\" (click)=\"tab(true)\">Kalite Kontrol Bekleyenler</button><button class=\"btn\" [class.btn-success]=\"!query.pendingOnly\" [class.btn-outline-secondary]=\"query.pendingOnly\" (click)=\"tab(false)\">T\u00FCm Kay\u0131tlar</button></div>\n <div class=\"row mb-3\"><div class=\"col-md-3\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.from\" /></div><div class=\"col-md-3\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.until\" /></div><div class=\"col-md-3\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"query.movementTypeCode\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{type.name}}</option></select></div><div class=\"col-md-3 d-flex align-items-end\"><button class=\"btn btn-primary\" (click)=\"load(true)\">Filtrele</button></div></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{error}}</div>\n <dx-data-grid #grid class=\"intake-grid\" [dataSource]=\"dataSource\" [remoteOperations]=\"{paging: true, filtering: true, sorting: true}\" [showBorders]=\"true\" [rowAlternationEnabled]=\"true\" [columnAutoWidth]=\"true\" [allowColumnResizing]=\"true\" columnResizingMode=\"widget\" style=\"height: calc(100vh - 350px)\">\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row><dxo-search-panel [visible]=\"true\" [width]=\"220\" placeholder=\"Ara\u2026\"></dxo-search-panel>\n <dxo-paging [pageSize]=\"20\"></dxo-paging><dxo-pager [visible]=\"true\" [showInfo]=\"true\" [allowedPageSizes]=\"[10,20,50]\" [showPageSizeSelector]=\"true\" [showNavigationButtons]=\"true\"></dxo-pager>\n <dxi-column caption=\"\u0130\u015Flemler\" cellTemplate=\"actions\" [allowFiltering]=\"false\" [allowSorting]=\"false\" [fixed]=\"true\" [width]=\"145\"></dxi-column>\n <dxi-column dataField=\"qualityStatus\" caption=\"Kalite Durumu\" cellTemplate=\"status\"><dxo-lookup [dataSource]=\"statuses\" valueExpr=\"value\" displayExpr=\"text\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sequenceNumber\" caption=\"S\u0131ra No\"></dxi-column><dxi-column dataField=\"docNum\" caption=\"Belge No\" dataType=\"number\"></dxi-column><dxi-column dataField=\"gateCode\" caption=\"Kap\u0131\"></dxi-column>\n <dxi-column dataField=\"entryDate\" caption=\"Giri\u015F Tarihi / Saati\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"movementTypeName\" caption=\"Ara\u00E7 Hareket T\u00FCr\u00FC\"></dxi-column><dxi-column dataField=\"movementDetailName\" caption=\"Detay\"></dxi-column>\n <dxi-column dataField=\"plate\" caption=\"Kamyon Plakas\u0131\"></dxi-column><dxi-column dataField=\"trailerPlate\" caption=\"Dorse Plakas\u0131\"></dxi-column><dxi-column dataField=\"driver\" caption=\"\u015Eof\u00F6r\"></dxi-column>\n <dxi-column dataField=\"partnerName\" caption=\"Muhatap\"></dxi-column><dxi-column dataField=\"shipName\" caption=\"Gemi\"></dxi-column><dxi-column dataField=\"stockTransferNumber\" caption=\"Stok Nakli\"></dxi-column>\n <dxi-column dataField=\"origin\" caption=\"Men\u015Fei\"><dxo-lookup [dataSource]=\"[{code:'Domestic',name:'\u0130\u00E7 Piyasa'},{code:'Imported',name:'\u0130thal'}]\" valueExpr=\"code\" displayExpr=\"name\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sealNumber\" caption=\"M\u00FCh\u00FCr No\"></dxi-column><dxi-column dataField=\"analyst\" caption=\"Analizi Yapan\"></dxi-column><dxi-column dataField=\"inspectedAt\" caption=\"Kontrol Tarihi\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"notes\" caption=\"A\u00E7\u0131klama\"></dxi-column>\n <div *dxTemplate=\"let cell of 'status'\"><span class=\"badge\" [class.badge-success]=\"cell.data.qualityStatus === 'Accepted'\" [class.badge-danger]=\"cell.data.qualityStatus === 'Rejected'\" [class.badge-warning]=\"cell.data.qualityStatus === 'Waiting' || cell.data.qualityStatus === 'Draft'\">{{statusLabel(cell.data.qualityStatus)}}</span></div>\n <div *dxTemplate=\"let cell of 'actions'\" class=\"intake-actions-cell\">\n <div ngbDropdown container=\"body\" class=\"d-inline-block\" placement=\"bottom-start top-start\">\n <button type=\"button\" ngbDropdownToggle class=\"btn btn-sm btn-primary intake-actions-toggle\"><i class=\"fa fa-cog\" aria-hidden=\"true\"></i><span>\u0130\u015Flemler</span></button>\n <div ngbDropdownMenu class=\"intake-action-menu\">\n <a ngbDropdownItem *ngIf=\"editable(cell.data) && allowed('Edit')\" [routerLink]=\"['/kalite/intake',cell.data.docEntry]\">{{cell.data.qualityStatus === 'Waiting' ? 'Kalite Kontrol Yap' : 'D\u00FCzenle'}}</a>\n <a ngbDropdownItem [routerLink]=\"['/kalite/intake',cell.data.docEntry]\" [queryParams]=\"{mode:'view'}\">\u00D6zeti G\u00F6r\u00FCnt\u00FCle</a>\n <button type=\"button\" ngbDropdownItem *ngIf=\"cell.data.qualityStatus !== 'Waiting' && allowed('Print')\" (click)=\"print(cell.data)\">Girdi Kontrol Formu Yazd\u0131r</button>\n <button type=\"button\" ngbDropdownItem *ngIf=\"editable(cell.data) && cell.data.qualityStatus !== 'Waiting' && allowed('Cancel')\" (click)=\"cancelRow = cell.data; reason = ''\">\u0130ptal Et</button>\n </div>\n </div>\n </div>\n </dx-data-grid>\n</div></div></div>\n<abp-modal [visible]=\"!!cancelRow\" (visibleChange)=\"!$event && (cancelRow = null)\" [busy]=\"busy\"><ng-template #abpHeader><h5>Kalite Kontrol\u00FCn\u00FC \u0130ptal Et</h5></ng-template><ng-template #abpBody><label>\u0130ptal Gerek\u00E7esi</label><textarea class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\"></textarea><p class=\"text-muted mt-2\">Kay\u0131t yeniden kalite kontrol bekleyenlere al\u0131n\u0131r.</p></ng-template><ng-template #abpFooter><button class=\"btn btn-secondary\" (click)=\"cancelRow = null\" [disabled]=\"busy\">Vazge\u00E7</button><button class=\"btn btn-danger\" (click)=\"cancel()\" [disabled]=\"busy || !reason.trim()\">\u0130ptal Et</button></ng-template></abp-modal>\n", styles: [".quality-loading{padding:1.5rem;text-align:center;color:#5b526c}.print-only{display:none}.quality-status{display:inline-flex;align-items:center;gap:.5rem;padding:.55rem .85rem;border:1px solid transparent;border-radius:.4rem;font-size:.9375rem;font-weight:600;line-height:1.4}.quality-status-accepted{color:#166534;background:#dcfce7;border-color:#86efac}.quality-status-rejected{color:#991b1b;background:#fee2e2;border-color:#fca5a5}.quality-status-draft{color:#1e40af;background:#dbeafe;border-color:#93c5fd}.quality-status-waiting{color:#854d0e;background:#fef3c7;border-color:#fcd34d}.vehicle-table{min-width:1950px;white-space:nowrap}.actions{min-width:130px}.quality-questions-link{display:inline-flex;align-items:center;min-height:calc(1.5em + .5rem + 2px);margin-left:.4rem;padding:.25rem .5rem;color:#9a5a00;background:#fff3d6;border:1px solid #edb85b;border-radius:.2rem;font-size:.875rem;line-height:1.5;text-decoration:none}.quality-questions-link:hover,.quality-questions-link:focus{color:#fff;background:#b86b00;border-color:#b86b00;text-decoration:none}.intake-actions-cell{display:flex;align-items:center}:host ::ng-deep .intake-grid .dx-data-row>td{vertical-align:middle}.intake-actions-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.3rem .65rem;font-family:inherit;font-size:.8125rem;line-height:1.3}.intake-action-menu{min-width:210px;margin-top:.35rem;padding:.3rem;background:#fff;border:1px solid #dee2e6;border-radius:.375rem;box-shadow:0 .25rem .75rem #0000001a}.intake-action-menu .dropdown-item{display:block;text-align:left;border:0;border-radius:.25rem;background:none;color:#343a40;padding:.5rem .65rem;font-family:inherit;font-size:.8125rem;font-weight:400;line-height:1.4;text-decoration:none;white-space:nowrap;cursor:pointer}.intake-action-menu .dropdown-item:hover,.intake-action-menu .dropdown-item:focus-visible{background:#eef2ff;color:#2446b5}.page-size{width:85px}.vehicle-info{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin:1rem 0}.vehicle-info label{font-size:.8rem;color:#6c757d;margin-bottom:.2rem}.vehicle-info p{background:#f5f3f8;padding:.55rem;min-height:2.5rem;overflow-wrap:anywhere}.measurement-table{min-width:700px}.measurement-table th{background:#f2edf7}.measurement-table td{vertical-align:middle}.out-of-limit,.rejected-row{background:#ffe6e9!important}.out-of-limit input,.out-of-limit select{border-color:#dc3545}@media (max-width: 900px){.vehicle-info{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 550px){.vehicle-info{grid-template-columns:1fr}}\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: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "component", type: i7.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExporting", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i8.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i8.DxoLookupComponent, selector: "dxo-lookup", inputs: ["allowClearing", "calculateCellValue", "dataSource", "displayExpr", "valueExpr"] }, { kind: "component", type: i8.DxoFilterRowComponent, selector: "dxo-filter-row", inputs: ["applyFilter", "applyFilterText", "betweenEndText", "betweenStartText", "operationDescriptions", "resetOperationText", "showAllText", "showOperationChooser", "visible"] }, { kind: "component", type: i8.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "label", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i8.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i8.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "directive", type: i9.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "directive", type: i10.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i10.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i10.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i10.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }] });
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IntakeListComponent, decorators: [{
|
|
74
|
+
type: Component,
|
|
75
|
+
args: [{ selector: 'lib-intake-list', template: "<div class=\"container-fluid\"><h3>Ham Ya\u011F Giri\u015F Kalite Kontrol</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-success]=\"query.pendingOnly\" [class.btn-outline-secondary]=\"!query.pendingOnly\" (click)=\"tab(true)\">Kalite Kontrol Bekleyenler</button><button class=\"btn\" [class.btn-success]=\"!query.pendingOnly\" [class.btn-outline-secondary]=\"query.pendingOnly\" (click)=\"tab(false)\">T\u00FCm Kay\u0131tlar</button></div>\n <div class=\"row mb-3\"><div class=\"col-md-3\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.from\" /></div><div class=\"col-md-3\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.until\" /></div><div class=\"col-md-3\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"query.movementTypeCode\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{type.name}}</option></select></div><div class=\"col-md-3 d-flex align-items-end\"><button class=\"btn btn-primary\" (click)=\"load(true)\">Filtrele</button></div></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{error}}</div>\n <dx-data-grid #grid class=\"intake-grid\" [dataSource]=\"dataSource\" [remoteOperations]=\"{paging: true, filtering: true, sorting: true}\" [showBorders]=\"true\" [rowAlternationEnabled]=\"true\" [columnAutoWidth]=\"true\" [allowColumnResizing]=\"true\" columnResizingMode=\"widget\" style=\"height: calc(100vh - 350px)\">\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row><dxo-search-panel [visible]=\"true\" [width]=\"220\" placeholder=\"Ara\u2026\"></dxo-search-panel>\n <dxo-paging [pageSize]=\"20\"></dxo-paging><dxo-pager [visible]=\"true\" [showInfo]=\"true\" [allowedPageSizes]=\"[10,20,50]\" [showPageSizeSelector]=\"true\" [showNavigationButtons]=\"true\"></dxo-pager>\n <dxi-column caption=\"\u0130\u015Flemler\" cellTemplate=\"actions\" [allowFiltering]=\"false\" [allowSorting]=\"false\" [fixed]=\"true\" [width]=\"145\"></dxi-column>\n <dxi-column dataField=\"qualityStatus\" caption=\"Kalite Durumu\" cellTemplate=\"status\"><dxo-lookup [dataSource]=\"statuses\" valueExpr=\"value\" displayExpr=\"text\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sequenceNumber\" caption=\"S\u0131ra No\"></dxi-column><dxi-column dataField=\"docNum\" caption=\"Belge No\" dataType=\"number\"></dxi-column><dxi-column dataField=\"gateCode\" caption=\"Kap\u0131\"></dxi-column>\n <dxi-column dataField=\"entryDate\" caption=\"Giri\u015F Tarihi / Saati\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"movementTypeName\" caption=\"Ara\u00E7 Hareket T\u00FCr\u00FC\"></dxi-column><dxi-column dataField=\"movementDetailName\" caption=\"Detay\"></dxi-column>\n <dxi-column dataField=\"plate\" caption=\"Kamyon Plakas\u0131\"></dxi-column><dxi-column dataField=\"trailerPlate\" caption=\"Dorse Plakas\u0131\"></dxi-column><dxi-column dataField=\"driver\" caption=\"\u015Eof\u00F6r\"></dxi-column>\n <dxi-column dataField=\"partnerName\" caption=\"Muhatap\"></dxi-column><dxi-column dataField=\"shipName\" caption=\"Gemi\"></dxi-column><dxi-column dataField=\"stockTransferNumber\" caption=\"Stok Nakli\"></dxi-column>\n <dxi-column dataField=\"origin\" caption=\"Men\u015Fei\"><dxo-lookup [dataSource]=\"[{code:'Domestic',name:'\u0130\u00E7 Piyasa'},{code:'Imported',name:'\u0130thal'}]\" valueExpr=\"code\" displayExpr=\"name\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sealNumber\" caption=\"M\u00FCh\u00FCr No\"></dxi-column><dxi-column dataField=\"analyst\" caption=\"Analizi Yapan\"></dxi-column><dxi-column dataField=\"inspectedAt\" caption=\"Kontrol Tarihi\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"notes\" caption=\"A\u00E7\u0131klama\"></dxi-column>\n <div *dxTemplate=\"let cell of 'status'\"><span class=\"badge\" [class.badge-success]=\"cell.data.qualityStatus === 'Accepted'\" [class.badge-danger]=\"cell.data.qualityStatus === 'Rejected'\" [class.badge-warning]=\"cell.data.qualityStatus === 'Waiting' || cell.data.qualityStatus === 'Draft'\">{{statusLabel(cell.data.qualityStatus)}}</span></div>\n <div *dxTemplate=\"let cell of 'actions'\" class=\"intake-actions-cell\">\n <div ngbDropdown container=\"body\" class=\"d-inline-block\" placement=\"bottom-start top-start\">\n <button type=\"button\" ngbDropdownToggle class=\"btn btn-sm btn-primary intake-actions-toggle\"><i class=\"fa fa-cog\" aria-hidden=\"true\"></i><span>\u0130\u015Flemler</span></button>\n <div ngbDropdownMenu class=\"intake-action-menu\">\n <a ngbDropdownItem *ngIf=\"editable(cell.data) && allowed('Edit')\" [routerLink]=\"['/kalite/intake',cell.data.docEntry]\">{{cell.data.qualityStatus === 'Waiting' ? 'Kalite Kontrol Yap' : 'D\u00FCzenle'}}</a>\n <a ngbDropdownItem [routerLink]=\"['/kalite/intake',cell.data.docEntry]\" [queryParams]=\"{mode:'view'}\">\u00D6zeti G\u00F6r\u00FCnt\u00FCle</a>\n <button type=\"button\" ngbDropdownItem *ngIf=\"cell.data.qualityStatus !== 'Waiting' && allowed('Print')\" (click)=\"print(cell.data)\">Girdi Kontrol Formu Yazd\u0131r</button>\n <button type=\"button\" ngbDropdownItem *ngIf=\"editable(cell.data) && cell.data.qualityStatus !== 'Waiting' && allowed('Cancel')\" (click)=\"cancelRow = cell.data; reason = ''\">\u0130ptal Et</button>\n </div>\n </div>\n </div>\n </dx-data-grid>\n</div></div></div>\n<abp-modal [visible]=\"!!cancelRow\" (visibleChange)=\"!$event && (cancelRow = null)\" [busy]=\"busy\"><ng-template #abpHeader><h5>Kalite Kontrol\u00FCn\u00FC \u0130ptal Et</h5></ng-template><ng-template #abpBody><label>\u0130ptal Gerek\u00E7esi</label><textarea class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\"></textarea><p class=\"text-muted mt-2\">Kay\u0131t yeniden kalite kontrol bekleyenlere al\u0131n\u0131r.</p></ng-template><ng-template #abpFooter><button class=\"btn btn-secondary\" (click)=\"cancelRow = null\" [disabled]=\"busy\">Vazge\u00E7</button><button class=\"btn btn-danger\" (click)=\"cancel()\" [disabled]=\"busy || !reason.trim()\">\u0130ptal Et</button></ng-template></abp-modal>\n", styles: [".quality-loading{padding:1.5rem;text-align:center;color:#5b526c}.print-only{display:none}.quality-status{display:inline-flex;align-items:center;gap:.5rem;padding:.55rem .85rem;border:1px solid transparent;border-radius:.4rem;font-size:.9375rem;font-weight:600;line-height:1.4}.quality-status-accepted{color:#166534;background:#dcfce7;border-color:#86efac}.quality-status-rejected{color:#991b1b;background:#fee2e2;border-color:#fca5a5}.quality-status-draft{color:#1e40af;background:#dbeafe;border-color:#93c5fd}.quality-status-waiting{color:#854d0e;background:#fef3c7;border-color:#fcd34d}.vehicle-table{min-width:1950px;white-space:nowrap}.actions{min-width:130px}.quality-questions-link{display:inline-flex;align-items:center;min-height:calc(1.5em + .5rem + 2px);margin-left:.4rem;padding:.25rem .5rem;color:#9a5a00;background:#fff3d6;border:1px solid #edb85b;border-radius:.2rem;font-size:.875rem;line-height:1.5;text-decoration:none}.quality-questions-link:hover,.quality-questions-link:focus{color:#fff;background:#b86b00;border-color:#b86b00;text-decoration:none}.intake-actions-cell{display:flex;align-items:center}:host ::ng-deep .intake-grid .dx-data-row>td{vertical-align:middle}.intake-actions-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.3rem .65rem;font-family:inherit;font-size:.8125rem;line-height:1.3}.intake-action-menu{min-width:210px;margin-top:.35rem;padding:.3rem;background:#fff;border:1px solid #dee2e6;border-radius:.375rem;box-shadow:0 .25rem .75rem #0000001a}.intake-action-menu .dropdown-item{display:block;text-align:left;border:0;border-radius:.25rem;background:none;color:#343a40;padding:.5rem .65rem;font-family:inherit;font-size:.8125rem;font-weight:400;line-height:1.4;text-decoration:none;white-space:nowrap;cursor:pointer}.intake-action-menu .dropdown-item:hover,.intake-action-menu .dropdown-item:focus-visible{background:#eef2ff;color:#2446b5}.page-size{width:85px}.vehicle-info{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin:1rem 0}.vehicle-info label{font-size:.8rem;color:#6c757d;margin-bottom:.2rem}.vehicle-info p{background:#f5f3f8;padding:.55rem;min-height:2.5rem;overflow-wrap:anywhere}.measurement-table{min-width:700px}.measurement-table th{background:#f2edf7}.measurement-table td{vertical-align:middle}.out-of-limit,.rejected-row{background:#ffe6e9!important}.out-of-limit input,.out-of-limit select{border-color:#dc3545}@media (max-width: 900px){.vehicle-info{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 550px){.vehicle-info{grid-template-columns:1fr}}\n"] }]
|
|
76
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }]; }, propDecorators: { grid: [{
|
|
77
|
+
type: ViewChild,
|
|
78
|
+
args: ['grid']
|
|
79
|
+
}] } });
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50YWtlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2FsaXRlL3NyYy9saWIvY29tcG9uZW50cy9pbnRha2UtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rYWxpdGUvc3JjL2xpYi9jb21wb25lbnRzL2ludGFrZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sV0FBVyxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7OztBQUd2RixNQUFNLE9BQU8sbUJBQW1CO0lBZ0I5QixZQUFvQixHQUFzQixFQUFVLFdBQThCO1FBQTlELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBZHpFLGFBQVEsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsSyxlQUFVLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7Z0JBQzdFLElBQUksQ0FBQyxLQUFLLEdB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ICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IER4RGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7IEludGFrZVZlaGljbGUsIE1vdmVtZW50VHlwZSB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcbmltcG9ydCB7IFF1YWxpdHlBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVhbGl0eS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBkb3dubG9hZCwgZXJyb3JNZXNzYWdlLCBzdGF0dXNMYWJlbCB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktbWVhc3VyZW1lbnRzJztcblxuQENvbXBvbmVudCh7IHNlbGVjdG9yOiAnbGliLWludGFrZS1saXN0JywgdGVtcGxhdGVVcmw6ICcuL2ludGFrZS1ncmlkLmNvbXBvbmVudC5odG1sJywgc3R5bGVVcmxzOiBbJy4vaW50YWtlLmNvbXBvbmVudC5zY3NzJ10gfSlcbmV4cG9ydCBjbGFzcyBJbnRha2VMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgnZ3JpZCcpIGdyaWQ/OiBEeERhdGFHcmlkQ29tcG9uZW50O1xuICByZWFkb25seSBzdGF0dXNlcyA9IFt7IHZhbHVlOiAnV2FpdGluZycsIHRleHQ6ICdCZWtsaXlvcicgfSwgeyB2YWx1ZTogJ0RyYWZ0JywgdGV4dDogJ1Rhc2xhaycgfSwgeyB2YWx1ZTogJ0FjY2VwdGVkJywgdGV4dDogJ0thYnVsJyB9LCB7IHZhbHVlOiAnUmVqZWN0ZWQnLCB0ZXh0OiAnUmV0JyB9XTtcbiAgcmVhZG9ubHkgZGF0YVNvdXJjZSA9IG5ldyBDdXN0b21TdG9yZSh7IGtleTogJ2RvY0VudHJ5JywgbG9hZDogYXN5bmMgb3B0aW9ucyA9PiB7XG4gICAgdGhpcy5lcnJvciA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmFwaS5pbnRha2VMaXN0KHsgLi4udGhpcy5xdWVyeSwgc2VhcmNoOiBTdHJpbmcob3B0aW9ucy5zZWFyY2hWYWx1ZSB8fCAnJyksXG4gICAgICAgIHNraXBDb3VudDogb3B0aW9ucy5za2lwIHx8IDAsIG1heFJlc3VsdENvdW50OiBvcHRpb25zLnRha2UgfHwgMjAsXG4gICAgICAgIGZpbHRlcjogb3B0aW9ucy5maWx0ZXIgPyBKU09OLnN0cmluZ2lmeShvcHRpb25zLmZpbHRlcikgOiAnJywgc29ydDogb3B0aW9ucy5zb3J0ID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5zb3J0KSA6ICcnIH0pKTtcbiAgICAgIHRoaXMucm93cyA9IHJlc3VsdC5pdGVtczsgdGhpcy50b3RhbCA9IHJlc3VsdC50b3RhbENvdW50O1xuICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0Lml0ZW1zLCB0b3RhbENvdW50OiByZXN1bHQudG90YWxDb3VudCB9O1xuICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhyb3cgbmV3IEVycm9yKHRoaXMuZXJyb3IpOyB9XG4gIH19KTtcbiAgcm93czogSW50YWtlVmVoaWNsZVtdID0gW107IHR5cGVzOiBNb3ZlbWVudFR5cGVbXSA9IFtdOyB0b3RhbCA9IDA7IGJ1c3kgPSBmYWxzZTsgZXJyb3IgPSAnJztcbiAgcXVlcnkgPSB7IHBlbmRpbmdPbmx5OiB0cnVlLCBmcm9tOiAnJywgdW50aWw6ICcnLCBzZWFyY2g6ICcnLCBtb3ZlbWVudFR5cGVDb2RlOiAnJywgc3RhdHVzOiAnJywgc2tpcENvdW50OiAwLCBtYXhSZXN1bHRDb3VudDogMjAgfTtcbiAgY2FuY2VsUm93OiBJbnRha2VWZWhpY2xlIHwgbnVsbCA9IG51bGw7IHJlYXNvbiA9ICcnOyBzdGF0dXNMYWJlbCA9IHN0YXR1c0xhYmVsO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwaTogUXVhbGl0eUFwaVNlcnZpY2UsIHByaXZhdGUgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25TZXJ2aWNlKSB7fVxuICBuZ09uSW5pdCgpOiB2b2lkIHsgdGhpcy5hcGkucXVhbGl0eU1vdmVtZW50VHlwZXMoKS5zdWJzY3JpYmUoeyBuZXh0OiB0eXBlcyA9PiB0aGlzLnR5cGVzID0gdHlwZXMsIGVycm9yOiBlID0+IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSkgfSk7IHRoaXMubG9hZCgpOyB9XG4gIGFsbG93ZWQocG9saWN5OiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMuZ2V0R3JhbnRlZFBvbGljeSgnS2FsaXRlLkludGFrZS4nICsgcG9saWN5KTsgfVxuICBlZGl0YWJsZShyb3c6IEludGFrZVZlaGljbGUpOiBib29sZWFuIHsgcmV0dXJuIHJvdy52ZWhpY2xlU3RhdHVzID09PSAnMCcgJiYgIXJvdy5maXJzdFdlaWdodCAmJiAhcm93Lmhhc0V4aXRlZDsgfVxuICBsb2FkKHJlc2V0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICBpZiAocmVzZXQpIHRoaXMuZ3JpZD8uaW5zdGFuY2UucGFnZUluZGV4KDApO1xuICAgIHRoaXMuZ3JpZD8uaW5zdGFuY2UucmVmcmVzaCgpO1xuICB9XG4gIHRhYihwZW5kaW5nOiBib29sZWFuKTogdm9pZCB7IHRoaXMucXVlcnkucGVuZGluZ09ubHkgPSBwZW5kaW5nOyB0aGlzLmxvYWQodHJ1ZSk7IH1cbiAgcGFnZShkaXJlY3Rpb246IG51bWJlcik6IHZvaWQgeyB0aGlzLnF1ZXJ5LnNraXBDb3VudCArPSBkaXJlY3Rpb24gKiB0aGlzLnF1ZXJ5Lm1heFJlc3VsdENvdW50OyB0aGlzLmxvYWQoKTsgfVxuICBnZXQgcGFnZU51bWJlcigpOiBudW1iZXIgeyByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnF1ZXJ5LnNraXBDb3VudCAvIHRoaXMucXVlcnkubWF4UmVzdWx0Q291bnQpICsgMTsgfVxuICBwcmludChyb3c6IEludGFrZVZlaGljbGUpOiB2b2lkIHsgdGhpcy5hcGkuaW50YWtlUGRmKHJvdy5kb2NFbnRyeSkuc3Vic2NyaWJlKHsgbmV4dDogYmxvYiA9PiBkb3dubG9hZChibG9iLCBgR2lyZGktS29udHJvbC0ke3Jvdy5kb2NFbnRyeX0ucGRmYCksIGVycm9yOiBlID0+IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSkgfSk7IH1cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5jZWxSb3cgfHwgIXRoaXMucmVhc29uLnRyaW0oKSkgeyB0aGlzLmVycm9yID0gJ8SwcHRhbCBnZXJla8OnZXNpIGdpcmluLic7IHJldHVybjsgfVxuICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgY29uc3QgaWQgPSB0aGlzLmNhbmNlbFJvdy5kb2NFbnRyeTtcbiAgICB0aGlzLmFwaS5pbnRha2UoaWQpLnN1YnNjcmliZSh7IG5leHQ6IGZvcm0gPT4gdGhpcy5hcGkuY2FuY2VsSW50YWtlKGlkLCBmb3JtLmluc3BlY3Rpb24ucmV2aXNpb24sIHRoaXMucmVhc29uKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4geyB0aGlzLmNhbmNlbFJvdyA9IG51bGw7IHRoaXMucmVhc29uID0gJyc7IHRoaXMubG9hZCgpOyB9LCBlcnJvcjogZSA9PiB7IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7IHRoaXMuYnVzeSA9IGZhbHNlOyB9XG4gICAgfSksIGVycm9yOiBlID0+IHsgdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhpcy5idXN5ID0gZmFsc2U7IH0gfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj48aDM+SGFtIFlhxJ8gR2lyacWfIEthbGl0ZSBLb250cm9sPC9oMz48ZGl2IGNsYXNzPVwiY2FyZFwiPjxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBtYi0zXCIgcm9sZT1cInRhYmxpc3RcIj48YnV0dG9uIGNsYXNzPVwiYnRuXCIgW2NsYXNzLmJ0bi1zdWNjZXNzXT1cInF1ZXJ5LnBlbmRpbmdPbmx5XCIgW2NsYXNzLmJ0bi1vdXRsaW5lLXNlY29uZGFyeV09XCIhcXVlcnkucGVuZGluZ09ubHlcIiAoY2xpY2spPVwidGFiKHRydWUpXCI+S2FsaXRlIEtvbnRyb2wgQmVrbGV5ZW5sZXI8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwiYnRuXCIgW2NsYXNzLmJ0bi1zdWNjZXNzXT1cIiFxdWVyeS5wZW5kaW5nT25seVwiIFtjbGFzcy5idG4tb3V0bGluZS1zZWNvbmRhcnldPVwicXVlcnkucGVuZGluZ09ubHlcIiAoY2xpY2spPVwidGFiKGZhbHNlKVwiPlTDvG0gS2F5xLF0bGFyPC9idXR0b24+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPjxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxsYWJlbD5CYcWfbGFuZ8Sxw6c8L2xhYmVsPjxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJxdWVyeS5mcm9tXCIgLz48L2Rpdj48ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj48bGFiZWw+Qml0acWfPC9sYWJlbD48aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicXVlcnkudW50aWxcIiAvPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxsYWJlbD5BcmHDpyBIYXJla2V0IFTDvHLDvDwvbGFiZWw+PHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicXVlcnkubW92ZW1lbnRUeXBlQ29kZVwiPjxvcHRpb24gdmFsdWU9XCJcIj5Uw7xtw7w8L29wdGlvbj48b3B0aW9uICpuZ0Zvcj1cImxldCB0eXBlIG9mIHR5cGVzXCIgW3ZhbHVlXT1cInR5cGUuY29kZVwiPnt7dHlwZS5uYW1lfX08L29wdGlvbj48L3NlbGVjdD48L2Rpdj48ZGl2IGNsYXNzPVwiY29sLW1kLTMgZC1mbGV4IGFsaWduLWl0ZW1zLWVuZFwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwibG9hZCh0cnVlKVwiPkZpbHRyZWxlPC9idXR0b24+PC9kaXY+PC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+e3tlcnJvcn19PC9kaXY+XG4gIDxkeC1kYXRhLWdyaWQgI2dyaWQgY2xhc3M9XCJpbnRha2UtZ3JpZFwiIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbcmVtb3RlT3BlcmF0aW9uc109XCJ7cGFnaW5nOiB0cnVlLCBmaWx0ZXJpbmc6IHRydWUsIHNvcnRpbmc6IHRydWV9XCIgW3Nob3dCb3JkZXJzXT1cInRydWVcIiBbcm93QWx0ZXJuYXRpb25FbmFibGVkXT1cInRydWVcIiBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIiBbYWxsb3dDb2x1bW5SZXNpemluZ109XCJ0cnVlXCIgY29sdW1uUmVzaXppbmdNb2RlPVwid2lkZ2V0XCIgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSAzNTBweClcIj5cbiAgICA8ZHhvLWZpbHRlci1yb3cgW3Zpc2libGVdPVwidHJ1ZVwiPjwvZHhvLWZpbHRlci1yb3c+PGR4by1zZWFyY2gtcGFuZWwgW3Zpc2libGVdPVwidHJ1ZVwiIFt3aWR0aF09XCIyMjBcIiBwbGFjZWhvbGRlcj1cIkFyYeKAplwiPjwvZHhvLXNlYXJjaC1wYW5lbD5cbiAgICA8ZHhvLXBhZ2luZyBbcGFnZVNpemVdPVwiMjBcIj48L2R4by1wYWdpbmc+PGR4by1wYWdlciBbdmlzaWJsZV09XCJ0cnVlXCIgW3Nob3dJbmZvXT1cInRydWVcIiBbYWxsb3dlZFBhZ2VTaXplc109XCJbMTAsMjAsNTBdXCIgW3Nob3dQYWdlU2l6ZVNlbGVjdG9yXT1cInRydWVcIiBbc2hvd05hdmlnYXRpb25CdXR0b25zXT1cInRydWVcIj48L2R4by1wYWdlcj5cbiAgICA8ZHhpLWNvbHVtbiBjYXB0aW9uPVwixLDFn2xlbWxlclwiIGNlbGxUZW1wbGF0ZT1cImFjdGlvbnNcIiBbYWxsb3dGaWx0ZXJpbmddPVwiZmFsc2VcIiBbYWxsb3dTb3J0aW5nXT1cImZhbHNlXCIgW2ZpeGVkXT1cInRydWVcIiBbd2lkdGhdPVwiMTQ1XCI+PC9keGktY29sdW1uPlxuICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInF1YWxpdHlTdGF0dXNcIiBjYXB0aW9uPVwiS2FsaXRlIER1cnVtdVwiIGNlbGxUZW1wbGF0ZT1cInN0YXR1c1wiPjxkeG8tbG9va3VwIFtkYXRhU291cmNlXT1cInN0YXR1c2VzXCIgdmFsdWVFeHByPVwidmFsdWVcIiBkaXNwbGF5RXhwcj1cInRleHRcIj48L2R4by1sb29rdXA+PC9keGktY29sdW1uPlxuICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInNlcXVlbmNlTnVtYmVyXCIgY2FwdGlvbj1cIlPEsXJhIE5vXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cImRvY051bVwiIGNhcHRpb249XCJCZWxnZSBOb1wiIGRhdGFUeXBlPVwibnVtYmVyXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cImdhdGVDb2RlXCIgY2FwdGlvbj1cIkthcMSxXCI+PC9keGktY29sdW1uPlxuICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImVudHJ5RGF0ZVwiIGNhcHRpb249XCJHaXJpxZ8gVGFyaWhpIC8gU2FhdGlcIiBkYXRhVHlwZT1cImRhdGV0aW1lXCIgZm9ybWF0PVwiZGQuTU0ueXl5eSBISDptbVwiPjwvZHhpLWNvbHVtbj48ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJtb3ZlbWVudFR5cGVOYW1lXCIgY2FwdGlvbj1cIkFyYcOnIEhhcmVrZXQgVMO8csO8XCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cIm1vdmVtZW50RGV0YWlsTmFtZVwiIGNhcHRpb249XCJEZXRheVwiPjwvZHhpLWNvbHVtbj5cbiAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJwbGF0ZVwiIGNhcHRpb249XCJLYW15b24gUGxha2FzxLFcIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwidHJhaWxlclBsYXRlXCIgY2FwdGlvbj1cIkRvcnNlIFBsYWthc8SxXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cImRyaXZlclwiIGNhcHRpb249XCLFnm9mw7ZyXCI+PC9keGktY29sdW1uPlxuICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInBhcnRuZXJOYW1lXCIgY2FwdGlvbj1cIk11aGF0YXBcIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwic2hpcE5hbWVcIiBjYXB0aW9uPVwiR2VtaVwiPjwvZHhpLWNvbHVtbj48ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJzdG9ja1RyYW5zZmVyTnVtYmVyXCIgY2FwdGlvbj1cIlN0b2sgTmFrbGlcIj48L2R4aS1jb2x1bW4+XG4gICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwib3JpZ2luXCIgY2FwdGlvbj1cIk1lbsWfZWlcIj48ZHhvLWxvb2t1cCBbZGF0YVNvdXJjZV09XCJbe2NvZGU6J0RvbWVzdGljJyxuYW1lOifEsMOnIFBpeWFzYSd9LHtjb2RlOidJbXBvcnRlZCcsbmFtZTonxLB0aGFsJ31dXCIgdmFsdWVFeHByPVwiY29kZVwiIGRpc3BsYXlFeHByPVwibmFtZVwiPjwvZHhvLWxvb2t1cD48L2R4aS1jb2x1bW4+XG4gICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwic2VhbE51bWJlclwiIGNhcHRpb249XCJNw7xow7xyIE5vXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cImFuYWx5c3RcIiBjYXB0aW9uPVwiQW5hbGl6aSBZYXBhblwiPjwvZHhpLWNvbHVtbj48ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJpbnNwZWN0ZWRBdFwiIGNhcHRpb249XCJLb250cm9sIFRhcmloaVwiIGRhdGFUeXBlPVwiZGF0ZXRpbWVcIiBmb3JtYXQ9XCJkZC5NTS55eXl5IEhIOm1tXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cIm5vdGVzXCIgY2FwdGlvbj1cIkHDp8Sxa2xhbWFcIj48L2R4aS1jb2x1bW4+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBjZWxsIG9mICdzdGF0dXMnXCI+PHNwYW4gY2xhc3M9XCJiYWRnZVwiIFtjbGFzcy5iYWRnZS1zdWNjZXNzXT1cImNlbGwuZGF0YS5xdWFsaXR5U3RhdHVzID09PSAnQWNjZXB0ZWQnXCIgW2NsYXNzLmJhZGdlLWRhbmdlcl09XCJjZWxsLmRhdGEucXVhbGl0eVN0YXR1cyA9PT0gJ1JlamVjdGVkJ1wiIFtjbGFzcy5iYWRnZS13YXJuaW5nXT1cImNlbGwuZGF0YS5xdWFsaXR5U3RhdHVzID09PSAnV2FpdGluZycgfHwgY2VsbC5kYXRhLnF1YWxpdHlTdGF0dXMgPT09ICdEcmFmdCdcIj57e3N0YXR1c0xhYmVsKGNlbGwuZGF0YS5xdWFsaXR5U3RhdHVzKX19PC9zcGFuPjwvZGl2PlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgY2VsbCBvZiAnYWN0aW9ucydcIiBjbGFzcz1cImludGFrZS1hY3Rpb25zLWNlbGxcIj5cbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gY29udGFpbmVyPVwiYm9keVwiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIiBwbGFjZW1lbnQ9XCJib3R0b20tc3RhcnQgdG9wLXN0YXJ0XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duVG9nZ2xlIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBpbnRha2UtYWN0aW9ucy10b2dnbGVcIj48aSBjbGFzcz1cImZhIGZhLWNvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48c3Bhbj7EsMWfbGVtbGVyPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cImludGFrZS1hY3Rpb24tbWVudVwiPlxuICAgICAgICAgIDxhIG5nYkRyb3Bkb3duSXRlbSAqbmdJZj1cImVkaXRhYmxlKGNlbGwuZGF0YSkgJiYgYWxsb3dlZCgnRWRpdCcpXCIgW3JvdXRlckxpbmtdPVwiWycva2FsaXRlL2ludGFrZScsY2VsbC5kYXRhLmRvY0VudHJ5XVwiPnt7Y2VsbC5kYXRhLnF1YWxpdHlTdGF0dXMgPT09ICdXYWl0aW5nJyA/ICdLYWxpdGUgS29udHJvbCBZYXAnIDogJ0TDvHplbmxlJ319PC9hPlxuICAgICAgICAgIDxhIG5nYkRyb3Bkb3duSXRlbSBbcm91dGVyTGlua109XCJbJy9rYWxpdGUvaW50YWtlJyxjZWxsLmRhdGEuZG9jRW50cnldXCIgW3F1ZXJ5UGFyYW1zXT1cInttb2RlOid2aWV3J31cIj7DlnpldGkgR8O2csO8bnTDvGxlPC9hPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAqbmdJZj1cImNlbGwuZGF0YS5xdWFsaXR5U3RhdHVzICE9PSAnV2FpdGluZycgJiYgYWxsb3dlZCgnUHJpbnQnKVwiIChjbGljayk9XCJwcmludChjZWxsLmRhdGEpXCI+R2lyZGkgS29udHJvbCBGb3JtdSBZYXpkxLFyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtICpuZ0lmPVwiZWRpdGFibGUoY2VsbC5kYXRhKSAmJiBjZWxsLmRhdGEucXVhbGl0eVN0YXR1cyAhPT0gJ1dhaXRpbmcnICYmIGFsbG93ZWQoJ0NhbmNlbCcpXCIgKGNsaWNrKT1cImNhbmNlbFJvdyA9IGNlbGwuZGF0YTsgcmVhc29uID0gJydcIj7EsHB0YWwgRXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9keC1kYXRhLWdyaWQ+XG48L2Rpdj48L2Rpdj48L2Rpdj5cbjxhYnAtbW9kYWwgW3Zpc2libGVdPVwiISFjYW5jZWxSb3dcIiAodmlzaWJsZUNoYW5nZSk9XCIhJGV2ZW50ICYmIChjYW5jZWxSb3cgPSBudWxsKVwiIFtidXN5XT1cImJ1c3lcIj48bmctdGVtcGxhdGUgI2FicEhlYWRlcj48aDU+S2FsaXRlIEtvbnRyb2zDvG7DvCDEsHB0YWwgRXQ8L2g1PjwvbmctdGVtcGxhdGU+PG5nLXRlbXBsYXRlICNhYnBCb2R5PjxsYWJlbD7EsHB0YWwgR2VyZWvDp2VzaTwvbGFiZWw+PHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjNcIiBbKG5nTW9kZWwpXT1cInJlYXNvblwiPjwvdGV4dGFyZWE+PHAgY2xhc3M9XCJ0ZXh0LW11dGVkIG10LTJcIj5LYXnEsXQgeWVuaWRlbiBrYWxpdGUga29udHJvbCBiZWtsZXllbmxlcmUgYWzEsW7EsXIuPC9wPjwvbmctdGVtcGxhdGU+PG5nLXRlbXBsYXRlICNhYnBGb290ZXI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNhbmNlbFJvdyA9IG51bGxcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPlZhemdlw6c8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwiY2FuY2VsKClcIiBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhcmVhc29uLnRyaW0oKVwiPsSwcHRhbCBFdDwvYnV0dG9uPjwvbmctdGVtcGxhdGU+PC9hYnAtbW9kYWw+XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../services/kalite.service";
|
|
4
|
+
export class KaliteComponent {
|
|
5
|
+
constructor(service) {
|
|
6
|
+
this.service = service;
|
|
7
|
+
}
|
|
8
|
+
ngOnInit() {
|
|
9
|
+
this.service.sample().subscribe(console.log);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
KaliteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KaliteComponent, deps: [{ token: i1.KaliteService }], target: i0.ɵɵFactoryTarget.Component });
|
|
13
|
+
KaliteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: KaliteComponent, selector: "lib-kalite", ngImport: i0, template: ` <p>kalite works!</p> `, isInline: true });
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KaliteComponent, decorators: [{
|
|
15
|
+
type: Component,
|
|
16
|
+
args: [{ selector: 'lib-kalite', template: ` <p>kalite works!</p> ` }]
|
|
17
|
+
}], ctorParameters: function () { return [{ type: i1.KaliteService }]; } });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FsaXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMva2FsaXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7QUFRbEQsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFBb0IsT0FBc0I7UUFBdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZTtJQUFHLENBQUM7SUFFOUMsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxDQUFDOzs0R0FMVSxlQUFlO2dHQUFmLGVBQWUsa0RBSGhCLHdCQUF3QjsyRkFHdkIsZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxZQUFZLFlBQ1osd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEthbGl0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9rYWxpdGUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1rYWxpdGUnLFxuICB0ZW1wbGF0ZTogYCA8cD5rYWxpdGUgd29ya3MhPC9wPiBgLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBLYWxpdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IEthbGl0ZVNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnNhbXBsZSgpLnN1YnNjcmliZShjb25zb2xlLmxvZyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { applicableLimit, recalculate } from '../services/quality-measurements';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../services/quality-api.service";
|
|
5
|
+
import * as i2 from "@abp/ng.core";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "@angular/forms";
|
|
8
|
+
export class ProcessAnalysisComponent {
|
|
9
|
+
constructor(api, permissions) {
|
|
10
|
+
this.api = api;
|
|
11
|
+
this.permissions = permissions;
|
|
12
|
+
this.tanks = [];
|
|
13
|
+
this.facilities = [];
|
|
14
|
+
this.facilityCode = '';
|
|
15
|
+
this.businessDate = this.today();
|
|
16
|
+
this.analysis = null;
|
|
17
|
+
this.groups = [];
|
|
18
|
+
this.parameters = [];
|
|
19
|
+
this.reason = '';
|
|
20
|
+
this.busy = true;
|
|
21
|
+
this.busyText = 'Tesisler yükleniyor…';
|
|
22
|
+
this.error = '';
|
|
23
|
+
this.reasonError = '';
|
|
24
|
+
}
|
|
25
|
+
ngOnInit() {
|
|
26
|
+
this.api.tanks().subscribe({ next: x => this.tanks = x.filter(t => t.active), error: () => { } });
|
|
27
|
+
this.api.facilities().subscribe({
|
|
28
|
+
next: facilities => {
|
|
29
|
+
this.facilities = facilities;
|
|
30
|
+
this.facilityCode = facilities[0]?.code || '';
|
|
31
|
+
if (this.facilityCode)
|
|
32
|
+
this.load();
|
|
33
|
+
else
|
|
34
|
+
this.busy = false;
|
|
35
|
+
},
|
|
36
|
+
error: () => { this.error = 'Tesisler yüklenemedi.'; this.busy = false; },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
get editable() {
|
|
40
|
+
return !this.busy && this.analysis?.status === 'Draft' &&
|
|
41
|
+
this.permissions.getGrantedPolicy('Kalite.ProcessAnalysis.Create');
|
|
42
|
+
}
|
|
43
|
+
get hasOutOfLimit() {
|
|
44
|
+
return this.analysis?.hours.some(h => h.measurements.some(v => v.outOfLimit)) || false;
|
|
45
|
+
}
|
|
46
|
+
get statusText() {
|
|
47
|
+
return { Draft: 'Taslak', LaborantSigned: 'Laborant imzaladı',
|
|
48
|
+
Checked: 'Mühendis kontrol etti', Approved: 'Onaylı' }[this.analysis?.status || ''] || '';
|
|
49
|
+
}
|
|
50
|
+
allowed(permission) {
|
|
51
|
+
return this.permissions.getGrantedPolicy(`Kalite.ProcessAnalysis.${permission}`);
|
|
52
|
+
}
|
|
53
|
+
load() {
|
|
54
|
+
if (!this.facilityCode || !this.businessDate)
|
|
55
|
+
return;
|
|
56
|
+
this.busy = true;
|
|
57
|
+
this.busyText = 'Analiz verileri yükleniyor…';
|
|
58
|
+
this.error = '';
|
|
59
|
+
this.api.process(this.facilityCode, this.businessDate).subscribe({
|
|
60
|
+
next: analysis => {
|
|
61
|
+
this.applyAnalysis(analysis);
|
|
62
|
+
this.busy = false;
|
|
63
|
+
},
|
|
64
|
+
error: () => { this.error = 'Analiz formu yüklenemedi.'; this.busy = false; },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
applyAnalysis(analysis) {
|
|
68
|
+
this.analysis = analysis;
|
|
69
|
+
const template = analysis.templateSnapshot;
|
|
70
|
+
this.groups = [...template.steps].sort((a, b) => a.order - b.order).map(step => ({
|
|
71
|
+
step,
|
|
72
|
+
parameters: template.parameters.filter(p => p.active && p.stepCode === step.processCode)
|
|
73
|
+
.sort((a, b) => a.order - b.order),
|
|
74
|
+
}));
|
|
75
|
+
this.parameters = [].concat(...this.groups.map(group => group.parameters));
|
|
76
|
+
for (const hour of analysis.hours) {
|
|
77
|
+
hour.measurements || (hour.measurements = []);
|
|
78
|
+
for (const parameter of this.parameters) {
|
|
79
|
+
if (!hour.measurements.some(v => v.parameterCode === parameter.code)) {
|
|
80
|
+
hour.measurements.push({ parameterCode: parameter.code, number: null, text: '', outOfLimit: false });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
measurement(row, parameter) {
|
|
86
|
+
return row.measurements.find(v => v.parameterCode === parameter.code);
|
|
87
|
+
}
|
|
88
|
+
limit(parameter) {
|
|
89
|
+
return applicableLimit(this.analysis?.templateSnapshot.limits || [], parameter.code, this.businessDate, this.analysis?.oilType || '');
|
|
90
|
+
}
|
|
91
|
+
limitLabel(parameter) {
|
|
92
|
+
const limit = this.limit(parameter);
|
|
93
|
+
if (!limit)
|
|
94
|
+
return '—';
|
|
95
|
+
if (limit.expectedText)
|
|
96
|
+
return limit.expectedText;
|
|
97
|
+
if (limit.minimum != null && limit.maximum != null)
|
|
98
|
+
return `${limit.minimum}–${limit.maximum}`;
|
|
99
|
+
if (limit.minimum != null)
|
|
100
|
+
return `≥ ${limit.minimum}`;
|
|
101
|
+
if (limit.maximum != null)
|
|
102
|
+
return `≤ ${limit.maximum}`;
|
|
103
|
+
return '—';
|
|
104
|
+
}
|
|
105
|
+
changed(row, parameter) {
|
|
106
|
+
try {
|
|
107
|
+
recalculate(this.parameters, row.measurements, this.analysis?.templateSnapshot.limits || [], this.businessDate, this.analysis?.oilType || '');
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
this.error = e instanceof Error ? e.message : 'Hesaplama yapılamadı.';
|
|
111
|
+
}
|
|
112
|
+
const value = this.measurement(row, parameter);
|
|
113
|
+
const limit = this.limit(parameter);
|
|
114
|
+
value.outOfLimit = !!limit && ((value.number != null &&
|
|
115
|
+
((limit.minimum != null && value.number < limit.minimum) ||
|
|
116
|
+
(limit.maximum != null && value.number > limit.maximum))) ||
|
|
117
|
+
(!!value.text && !!limit.expectedText &&
|
|
118
|
+
value.text.trim().toLocaleLowerCase('tr-TR') !== limit.expectedText.trim().toLocaleLowerCase('tr-TR')));
|
|
119
|
+
}
|
|
120
|
+
oilTypeChanged() {
|
|
121
|
+
for (const row of this.analysis?.hours || [])
|
|
122
|
+
for (const parameter of this.parameters)
|
|
123
|
+
this.changed(row, parameter);
|
|
124
|
+
}
|
|
125
|
+
average(parameter) {
|
|
126
|
+
const values = this.analysis?.hours.map(h => this.measurement(h, parameter).number)
|
|
127
|
+
.filter((v) => v != null) || [];
|
|
128
|
+
if (!values.length)
|
|
129
|
+
return '—';
|
|
130
|
+
return (values.reduce((a, b) => a + b, 0) / values.length).toFixed(parameter.decimalPlaces);
|
|
131
|
+
}
|
|
132
|
+
save() {
|
|
133
|
+
if (!this.analysis || !this.editable)
|
|
134
|
+
return;
|
|
135
|
+
this.busy = true;
|
|
136
|
+
this.busyText = 'Form kaydediliyor…';
|
|
137
|
+
this.error = '';
|
|
138
|
+
const input = {
|
|
139
|
+
facilityCode: this.analysis.facilityCode,
|
|
140
|
+
businessDate: this.businessDate,
|
|
141
|
+
oilType: this.analysis.oilType,
|
|
142
|
+
notes: this.analysis.notes,
|
|
143
|
+
revision: this.analysis.revision,
|
|
144
|
+
hours: this.analysis.hours,
|
|
145
|
+
};
|
|
146
|
+
this.api.saveProcess(input).subscribe({
|
|
147
|
+
next: analysis => { this.applyAnalysis(analysis); this.busy = false; },
|
|
148
|
+
error: () => { this.error = 'Form kaydedilemedi. Alanları ve bağlantıyı kontrol edin.'; this.busy = false; },
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
decision(action) {
|
|
152
|
+
if (!this.analysis || !this.analysis.revision)
|
|
153
|
+
return;
|
|
154
|
+
if ((action === 'revoke' || (action === 'approve' && this.hasOutOfLimit)) && !this.reason.trim()) {
|
|
155
|
+
this.reasonError = 'Bu işlem için gerekçe girin.';
|
|
156
|
+
setTimeout(() => this.reasonInput?.nativeElement.focus());
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this.busy = true;
|
|
160
|
+
this.busyText = 'İşlem tamamlanıyor…';
|
|
161
|
+
this.error = '';
|
|
162
|
+
this.reasonError = '';
|
|
163
|
+
this.api.decision(this.analysis.code, action, this.analysis.revision, this.reason).subscribe({
|
|
164
|
+
next: analysis => { this.reason = ''; this.applyAnalysis(analysis); this.busy = false; },
|
|
165
|
+
error: () => { this.error = 'İşlem tamamlanamadı. Formun son durumunu kontrol edin.'; this.busy = false; },
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
downloadPdf() {
|
|
169
|
+
if (!this.analysis?.revision)
|
|
170
|
+
return;
|
|
171
|
+
this.api.pdf(this.analysis.code).subscribe({
|
|
172
|
+
next: blob => {
|
|
173
|
+
const url = URL.createObjectURL(blob);
|
|
174
|
+
const anchor = document.createElement('a');
|
|
175
|
+
anchor.href = url;
|
|
176
|
+
anchor.download = `${this.analysis?.formSnapshot.documentCode}-${this.analysis?.code}.pdf`;
|
|
177
|
+
anchor.click();
|
|
178
|
+
setTimeout(() => URL.revokeObjectURL(url), 1000);
|
|
179
|
+
},
|
|
180
|
+
error: () => this.error = 'PDF oluşturulamadı.',
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
today() {
|
|
184
|
+
const date = new Date();
|
|
185
|
+
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
ProcessAnalysisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ProcessAnalysisComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
189
|
+
ProcessAnalysisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ProcessAnalysisComponent, selector: "lib-process-analysis", viewQueries: [{ propertyName: "reasonInput", first: true, predicate: ["reasonInput"], descendants: true }], ngImport: i0, template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Rafineri Proses Analiz Kontrol</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-3\">\r\n <label for=\"facility\">Tesis</label>\r\n <select id=\"facility\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"facilityCode\" (change)=\"load()\">\r\n <option *ngFor=\"let facility of facilities\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label for=\"businessDate\">\u0130\u015F g\u00FCn\u00FC</label>\r\n <input id=\"businessDate\" type=\"date\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"businessDate\" (change)=\"load()\" />\r\n </div>\r\n <div class=\"col-md-3\" *ngIf=\"analysis?.facilityCode === 'DEO3'\">\r\n <label for=\"oilType\">\u00DCretilen ya\u011F cinsi</label>\r\n <select id=\"oilType\" class=\"form-control\" [(ngModel)]=\"analysis!.oilType\" (change)=\"oilTypeChanged()\" [disabled]=\"!editable\">\r\n <option value=\"\">Se\u00E7iniz</option><option value=\"Palm Oil\">Palm Oil</option>\r\n <option value=\"Palm Olein\">Palm Olein</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3 text-md-right mt-2 mt-md-0\">\r\n <span *ngIf=\"analysis\" class=\"badge badge-info mr-2\" style=\"margin-right: 6px;\">{{ statusText }}</span>\r\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"!analysis?.revision || busy\"\r\n *ngIf=\"allowed('Print')\">Formu Yazd\u0131r (PDF)</button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{ error }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <ng-container *ngIf=\"analysis\">\r\n <div class=\"small text-muted mb-2\">{{ analysis.formSnapshot.name }} \u00B7 {{ analysis.formSnapshot.documentCode }} \u00B7 Revizyon {{ analysis.formSnapshot.revisionNumber }}</div>\r\n <div class=\"quality-grid-scroll\" [hidden]=\"busy\">\r\n <table class=\"table table-bordered table-sm quality-grid\">\r\n <thead>\r\n <tr class=\"text-center bg-light\">\r\n <th rowspan=\"3\" class=\"sticky-hour\">Saat</th><th rowspan=\"3\">Vardiya / Laborant</th>\r\n <th rowspan=\"3\">Al\u0131nan Tank No</th>\r\n <th *ngFor=\"let group of groups\" [attr.colspan]=\"group.parameters.length\">{{ group.step.name }}</th>\r\n <th rowspan=\"3\">Aktar\u0131lan Tank No</th>\r\n </tr>\r\n <tr class=\"text-center bg-light\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ parameter.name }}<small *ngIf=\"parameter.unit\"> ({{ parameter.unit }})</small></th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"text-center limit-row\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ limitLabel(parameter) }}</th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of analysis.hours\">\r\n <th class=\"sticky-hour\">{{ row.hour | number:'2.0-0' }}:00</th><td><small>{{row.shiftCode}}</small><input class=\"form-control form-control-sm\" [(ngModel)]=\"row.analyst\" [disabled]=\"!editable\" aria-label=\"Vardiya laborant\u0131\" /></td>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.intakeTank\" [disabled]=\"!editable\" aria-label=\"Al\u0131nan tank\" /></td>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\" [class.out-of-limit]=\"measurement(row, parameter).outOfLimit\">\r\n <input *ngIf=\"parameter.valueType === 'Number' || parameter.calculated\" type=\"number\"\r\n class=\"form-control form-control-sm value-input\" [attr.step]=\"'any'\"\r\n [(ngModel)]=\"measurement(row, parameter).number\" (ngModelChange)=\"changed(row, parameter)\"\r\n [disabled]=\"!editable || parameter.calculated\" [attr.aria-label]=\"parameter.name\" />\r\n <select *ngIf=\"parameter.valueType === 'Choice' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (change)=\"changed(row, parameter)\" [disabled]=\"!editable\">\r\n <option value=\"\"></option><option *ngFor=\"let option of parameter.options\" [value]=\"option\">{{ option }}</option>\r\n </select>\r\n <input *ngIf=\"parameter.valueType === 'Text' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (ngModelChange)=\"changed(row, parameter)\" [disabled]=\"!editable\"\r\n [attr.aria-label]=\"parameter.name\" />\r\n </td>\r\n </ng-container>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.outputTank\" [disabled]=\"!editable\" aria-label=\"Aktar\u0131lan tank\" /></td>\r\n </tr>\r\n <tr class=\"average-row\">\r\n <th colspan=\"3\">ORTALAMA</th>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\">{{ parameter.valueType === 'Number' ? average(parameter) : '\u2014' }}</td>\r\n </ng-container>\r\n <td></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <div class=\"col-md-6\">\r\n <label for=\"notes\">{{ analysis.formSnapshot.code === 'FR52' ? 'A\u00E7\u0131klama / Bilgi' : 'Notlar' }}</label>\r\n <textarea id=\"notes\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"analysis.notes\" [disabled]=\"!editable\"></textarea>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label for=\"reason\">Onay / geri alma gerek\u00E7esi</label>\r\n <textarea #reasonInput id=\"reason\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\" (ngModelChange)=\"reasonError = ''\"\r\n [class.is-invalid]=\"reasonError\" [attr.aria-invalid]=\"!!reasonError\"\r\n [disabled]=\"busy || analysis.status === 'LaborantSigned'\"></textarea>\r\n <div *ngIf=\"reasonError\" class=\"invalid-feedback d-block\" role=\"alert\">{{ reasonError }}</div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 d-flex flex-wrap align-items-center gap-2\">\r\n <button class=\"btn btn-primary mr-2 mb-2\" (click)=\"save()\" [disabled]=\"!editable || busy\">Kaydet</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'Draft' && allowed('Sign')\"\r\n (click)=\"decision('sign')\" [disabled]=\"!analysis.revision || busy\">Laborant Olarak \u0130mzala</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'LaborantSigned' && allowed('Check')\"\r\n (click)=\"decision('check')\" [disabled]=\"busy\">M\u00FChendis Kontrol\u00FC</button>\r\n <button class=\"btn btn-success mr-2 mb-2\" *ngIf=\"analysis.status === 'Checked' && allowed('Approve')\"\r\n (click)=\"decision('approve')\" [disabled]=\"busy\">Son Onay</button>\r\n <button class=\"btn btn-outline-danger mr-2 mb-2\" *ngIf=\"analysis.status === 'Approved' && allowed('Revoke')\"\r\n (click)=\"decision('revoke')\" [disabled]=\"busy\">Onay\u0131 Geri Al</button>\r\n <span *ngIf=\"hasOutOfLimit\" class=\"text-danger mb-2\">Limit d\u0131\u015F\u0131 \u00F6l\u00E7\u00FCm var. Son onay i\u00E7in gerek\u00E7e gerekli.</span>\r\n </div>\r\n <div class=\"mt-3 small text-muted\">\r\n <span>Laborant: {{ analysis.laborant?.userName || '\u2014' }}</span> \u00B7\r\n <span>M\u00FChendis: {{ analysis.engineer?.userName || '\u2014' }}</span> \u00B7\r\n <span>Onaylayan: {{ analysis.approver?.userName || '\u2014' }}</span>\r\n </div>\r\n <details class=\"mt-3\" *ngIf=\"analysis.history?.length\">\r\n <summary>\u0130\u015Flem ge\u00E7mi\u015Fi</summary>\r\n <ul class=\"mt-2\"><li *ngFor=\"let event of analysis.history\">{{ event.action }} \u00B7 {{ event.userName }} \u00B7 {{ event.occurredAt | date:'dd.MM.yyyy HH:mm' }}<span *ngIf=\"event.reason\"> \u00B7 {{ event.reason }}</span></li></ul>\r\n </details>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<datalist id=\"qualityTanks\"><option *ngFor=\"let tank of tanks\" [value]=\"tank.code\">{{tank.name}}</option></datalist>\r\n", styles: [".quality-grid-scroll{overflow:auto;max-height:calc(100vh - 340px)}.quality-grid{width:max-content;min-width:100%;table-layout:fixed}.quality-grid th,.quality-grid td{min-width:105px;vertical-align:middle;white-space:nowrap}.quality-grid .sticky-hour{position:sticky;left:0;z-index:2;min-width:72px;background:#f8f9fa}.quality-grid thead{position:sticky;top:0;z-index:3}.quality-grid thead th{background:#f8f9fa}.quality-grid thead .sticky-hour{z-index:4}.quality-grid .value-input{min-width:90px;width:100%}.quality-grid .tank-input{min-width:110px;width:100%}.quality-grid .limit-row{color:#6f42a4;font-size:.82rem}.quality-grid .out-of-limit{background:#ffe0e0}.quality-grid .out-of-limit input,.quality-grid .out-of-limit select{border-color:#d33}.quality-grid .average-row{background:#fff8d8;font-weight:600}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\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: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] });
|
|
190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ProcessAnalysisComponent, decorators: [{
|
|
191
|
+
type: Component,
|
|
192
|
+
args: [{ selector: 'lib-process-analysis', template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Rafineri Proses Analiz Kontrol</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-3\">\r\n <label for=\"facility\">Tesis</label>\r\n <select id=\"facility\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"facilityCode\" (change)=\"load()\">\r\n <option *ngFor=\"let facility of facilities\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label for=\"businessDate\">\u0130\u015F g\u00FCn\u00FC</label>\r\n <input id=\"businessDate\" type=\"date\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"businessDate\" (change)=\"load()\" />\r\n </div>\r\n <div class=\"col-md-3\" *ngIf=\"analysis?.facilityCode === 'DEO3'\">\r\n <label for=\"oilType\">\u00DCretilen ya\u011F cinsi</label>\r\n <select id=\"oilType\" class=\"form-control\" [(ngModel)]=\"analysis!.oilType\" (change)=\"oilTypeChanged()\" [disabled]=\"!editable\">\r\n <option value=\"\">Se\u00E7iniz</option><option value=\"Palm Oil\">Palm Oil</option>\r\n <option value=\"Palm Olein\">Palm Olein</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3 text-md-right mt-2 mt-md-0\">\r\n <span *ngIf=\"analysis\" class=\"badge badge-info mr-2\" style=\"margin-right: 6px;\">{{ statusText }}</span>\r\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"!analysis?.revision || busy\"\r\n *ngIf=\"allowed('Print')\">Formu Yazd\u0131r (PDF)</button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{ error }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <ng-container *ngIf=\"analysis\">\r\n <div class=\"small text-muted mb-2\">{{ analysis.formSnapshot.name }} \u00B7 {{ analysis.formSnapshot.documentCode }} \u00B7 Revizyon {{ analysis.formSnapshot.revisionNumber }}</div>\r\n <div class=\"quality-grid-scroll\" [hidden]=\"busy\">\r\n <table class=\"table table-bordered table-sm quality-grid\">\r\n <thead>\r\n <tr class=\"text-center bg-light\">\r\n <th rowspan=\"3\" class=\"sticky-hour\">Saat</th><th rowspan=\"3\">Vardiya / Laborant</th>\r\n <th rowspan=\"3\">Al\u0131nan Tank No</th>\r\n <th *ngFor=\"let group of groups\" [attr.colspan]=\"group.parameters.length\">{{ group.step.name }}</th>\r\n <th rowspan=\"3\">Aktar\u0131lan Tank No</th>\r\n </tr>\r\n <tr class=\"text-center bg-light\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ parameter.name }}<small *ngIf=\"parameter.unit\"> ({{ parameter.unit }})</small></th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"text-center limit-row\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ limitLabel(parameter) }}</th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of analysis.hours\">\r\n <th class=\"sticky-hour\">{{ row.hour | number:'2.0-0' }}:00</th><td><small>{{row.shiftCode}}</small><input class=\"form-control form-control-sm\" [(ngModel)]=\"row.analyst\" [disabled]=\"!editable\" aria-label=\"Vardiya laborant\u0131\" /></td>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.intakeTank\" [disabled]=\"!editable\" aria-label=\"Al\u0131nan tank\" /></td>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\" [class.out-of-limit]=\"measurement(row, parameter).outOfLimit\">\r\n <input *ngIf=\"parameter.valueType === 'Number' || parameter.calculated\" type=\"number\"\r\n class=\"form-control form-control-sm value-input\" [attr.step]=\"'any'\"\r\n [(ngModel)]=\"measurement(row, parameter).number\" (ngModelChange)=\"changed(row, parameter)\"\r\n [disabled]=\"!editable || parameter.calculated\" [attr.aria-label]=\"parameter.name\" />\r\n <select *ngIf=\"parameter.valueType === 'Choice' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (change)=\"changed(row, parameter)\" [disabled]=\"!editable\">\r\n <option value=\"\"></option><option *ngFor=\"let option of parameter.options\" [value]=\"option\">{{ option }}</option>\r\n </select>\r\n <input *ngIf=\"parameter.valueType === 'Text' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (ngModelChange)=\"changed(row, parameter)\" [disabled]=\"!editable\"\r\n [attr.aria-label]=\"parameter.name\" />\r\n </td>\r\n </ng-container>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.outputTank\" [disabled]=\"!editable\" aria-label=\"Aktar\u0131lan tank\" /></td>\r\n </tr>\r\n <tr class=\"average-row\">\r\n <th colspan=\"3\">ORTALAMA</th>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\">{{ parameter.valueType === 'Number' ? average(parameter) : '\u2014' }}</td>\r\n </ng-container>\r\n <td></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <div class=\"col-md-6\">\r\n <label for=\"notes\">{{ analysis.formSnapshot.code === 'FR52' ? 'A\u00E7\u0131klama / Bilgi' : 'Notlar' }}</label>\r\n <textarea id=\"notes\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"analysis.notes\" [disabled]=\"!editable\"></textarea>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label for=\"reason\">Onay / geri alma gerek\u00E7esi</label>\r\n <textarea #reasonInput id=\"reason\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\" (ngModelChange)=\"reasonError = ''\"\r\n [class.is-invalid]=\"reasonError\" [attr.aria-invalid]=\"!!reasonError\"\r\n [disabled]=\"busy || analysis.status === 'LaborantSigned'\"></textarea>\r\n <div *ngIf=\"reasonError\" class=\"invalid-feedback d-block\" role=\"alert\">{{ reasonError }}</div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 d-flex flex-wrap align-items-center gap-2\">\r\n <button class=\"btn btn-primary mr-2 mb-2\" (click)=\"save()\" [disabled]=\"!editable || busy\">Kaydet</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'Draft' && allowed('Sign')\"\r\n (click)=\"decision('sign')\" [disabled]=\"!analysis.revision || busy\">Laborant Olarak \u0130mzala</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'LaborantSigned' && allowed('Check')\"\r\n (click)=\"decision('check')\" [disabled]=\"busy\">M\u00FChendis Kontrol\u00FC</button>\r\n <button class=\"btn btn-success mr-2 mb-2\" *ngIf=\"analysis.status === 'Checked' && allowed('Approve')\"\r\n (click)=\"decision('approve')\" [disabled]=\"busy\">Son Onay</button>\r\n <button class=\"btn btn-outline-danger mr-2 mb-2\" *ngIf=\"analysis.status === 'Approved' && allowed('Revoke')\"\r\n (click)=\"decision('revoke')\" [disabled]=\"busy\">Onay\u0131 Geri Al</button>\r\n <span *ngIf=\"hasOutOfLimit\" class=\"text-danger mb-2\">Limit d\u0131\u015F\u0131 \u00F6l\u00E7\u00FCm var. Son onay i\u00E7in gerek\u00E7e gerekli.</span>\r\n </div>\r\n <div class=\"mt-3 small text-muted\">\r\n <span>Laborant: {{ analysis.laborant?.userName || '\u2014' }}</span> \u00B7\r\n <span>M\u00FChendis: {{ analysis.engineer?.userName || '\u2014' }}</span> \u00B7\r\n <span>Onaylayan: {{ analysis.approver?.userName || '\u2014' }}</span>\r\n </div>\r\n <details class=\"mt-3\" *ngIf=\"analysis.history?.length\">\r\n <summary>\u0130\u015Flem ge\u00E7mi\u015Fi</summary>\r\n <ul class=\"mt-2\"><li *ngFor=\"let event of analysis.history\">{{ event.action }} \u00B7 {{ event.userName }} \u00B7 {{ event.occurredAt | date:'dd.MM.yyyy HH:mm' }}<span *ngIf=\"event.reason\"> \u00B7 {{ event.reason }}</span></li></ul>\r\n </details>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<datalist id=\"qualityTanks\"><option *ngFor=\"let tank of tanks\" [value]=\"tank.code\">{{tank.name}}</option></datalist>\r\n", styles: [".quality-grid-scroll{overflow:auto;max-height:calc(100vh - 340px)}.quality-grid{width:max-content;min-width:100%;table-layout:fixed}.quality-grid th,.quality-grid td{min-width:105px;vertical-align:middle;white-space:nowrap}.quality-grid .sticky-hour{position:sticky;left:0;z-index:2;min-width:72px;background:#f8f9fa}.quality-grid thead{position:sticky;top:0;z-index:3}.quality-grid thead th{background:#f8f9fa}.quality-grid thead .sticky-hour{z-index:4}.quality-grid .value-input{min-width:90px;width:100%}.quality-grid .tank-input{min-width:110px;width:100%}.quality-grid .limit-row{color:#6f42a4;font-size:.82rem}.quality-grid .out-of-limit{background:#ffe0e0}.quality-grid .out-of-limit input,.quality-grid .out-of-limit select{border-color:#d33}.quality-grid .average-row{background:#fff8d8;font-weight:600}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\n"] }]
|
|
193
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }]; }, propDecorators: { reasonInput: [{
|
|
194
|
+
type: ViewChild,
|
|
195
|
+
args: ['reasonInput']
|
|
196
|
+
}] } });
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1hbmFseXNpcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rYWxpdGUvc3JjL2xpYi9jb21wb25lbnRzL3Byb2Nlc3MtYW5hbHlzaXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2FsaXRlL3NyYy9saWIvY29tcG9uZW50cy9wcm9jZXNzLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVF6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7QUFPaEYsTUFBTSxPQUFPLHdCQUF3QjtJQWVuQyxZQUFvQixHQUFzQixFQUFVLFdBQThCO1FBQTlELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBZGxGLFVBQUssR0FBa0IsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBQ25DLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLGFBQVEsR0FBMkIsSUFBSSxDQUFDO1FBQ3hDLFdBQU0sR0FBNEQsRUFBRSxDQUFDO1FBQ3JFLGVBQVUsR0FBdUIsRUFBRSxDQUFDO1FBQ3BDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osYUFBUSxHQUFHLHNCQUFzQixDQUFDO1FBQ2xDLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztJQUdvRSxDQUFDO0lBRXRGLFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUks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QUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxNQUFNLENBQUM7Z0JBQzNGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcscUJBQXFCO1NBQ2hELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLO1FBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QixPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQzVILENBQUM7O3FIQXBMVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qix3S0NmckMsOG9TQWlJQTsyRkRsSGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjt3SUFpQk4sV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgUXVhbGl0eUFuYWx5c2lzLCBRdWFsaXR5RmFjaWxpdHksIFF1YWxpdHlIb3VyLCBRdWFsaXR5TGltaXQsXHJcbiAgUXVhbGl0eU1lYXN1cmVtZW50LCBRdWFsaXR5UGFyYW1ldGVyLCBRdWFsaXR5U3RlcCxcclxufSBmcm9tICcuLi9tb2RlbHMvcXVhbGl0eS5tb2RlbHMnO1xyXG5pbXBvcnQgeyBRdWFsaXR5QXBpU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBRdWFsaXR5VGFuayB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcclxuaW1wb3J0IHsgYXBwbGljYWJsZUxpbWl0LCByZWNhbGN1bGF0ZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktbWVhc3VyZW1lbnRzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXByb2Nlc3MtYW5hbHlzaXMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9jZXNzLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wcm9jZXNzLWFuYWx5c2lzLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9jZXNzQW5hbHlzaXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHRhbmtzOiBRdWFsaXR5VGFua1tdID0gW107XHJcbiAgZmFjaWxpdGllczogUXVhbGl0eUZhY2lsaXR5W10gPSBbXTtcclxuICBmYWNpbGl0eUNvZGUgPSAnJztcclxuICBidXNpbmVzc0RhdGUgPSB0aGlzLnRvZGF5KCk7XHJcbiAgYW5hbHlzaXM6IFF1YWxpdHlBbmFseXNpcyB8IG51bGwgPSBudWxsO1xyXG4gIGdyb3VwczogeyBzdGVwOiBRdWFsaXR5U3RlcDsgcGFyYW1ldGVyczogUXVhbGl0eVBhcmFtZXRlcltdIH1bXSA9IFtdO1xyXG4gIHBhcmFtZXRlcnM6IFF1YWxpdHlQYXJhbWV0ZXJbXSA9IFtdO1xyXG4gIHJlYXNvbiA9ICcnO1xyXG4gIGJ1c3kgPSB0cnVlO1xyXG4gIGJ1c3lUZXh0ID0gJ1Rlc2lzbGVyIHnDvGtsZW5peW9y4oCmJztcclxuICBlcnJvciA9ICcnO1xyXG4gIHJlYXNvbkVycm9yID0gJyc7XHJcbiAgQFZpZXdDaGlsZCgncmVhc29uSW5wdXQnKSByZWFzb25JbnB1dD86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBpOiBRdWFsaXR5QXBpU2VydmljZSwgcHJpdmF0ZSBwZXJtaXNzaW9uczogUGVybWlzc2lvblNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcGkudGFua3MoKS5zdWJzY3JpYmUoeyBuZXh0OiB4ID0+IHRoaXMudGFua3MgPSB4LmZpbHRlcih0ID0+IHQuYWN0aXZlKSwgZXJyb3I6ICgpID0+IHt9IH0pO1xyXG4gICAgdGhpcy5hcGkuZmFjaWxpdGllcygpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGZhY2lsaXRpZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuZmFjaWxpdGllcyA9IGZhY2lsaXRpZXM7XHJcbiAgICAgICAgdGhpcy5mYWNpbGl0eUNvZGUgPSBmYWNpbGl0aWVzWzBdPy5jb2RlIHx8ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLmZhY2lsaXR5Q29kZSkgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmJ1c3kgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5lcnJvciA9ICdUZXNpc2xlciB5w7xrbGVuZW1lZGkuJzsgdGhpcy5idXN5ID0gZmFsc2U7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBlZGl0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5idXN5ICYmIHRoaXMuYW5hbHlzaXM/LnN0YXR1cyA9PT0gJ0RyYWZ0JyAmJlxyXG4gICAgICB0aGlzLnBlcm1pc3Npb25zLmdldEdyYW50ZWRQb2xpY3koJ0thbGl0ZS5Qcm9jZXNzQW5hbHlzaXMuQ3JlYXRlJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzT3V0T2ZMaW1pdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFuYWx5c2lzPy5ob3Vycy5zb21lKGggPT4gaC5tZWFzdXJlbWVudHMuc29tZSh2ID0+IHYub3V0T2ZMaW1pdCkpIHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXR1c1RleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoeyBEcmFmdDogJ1Rhc2xhaycsIExhYm9yYW50U2lnbmVkOiAnTGFib3JhbnQgaW16YWxhZMSxJyxcclxuICAgICAgQ2hlY2tlZDogJ03DvGhlbmRpcyBrb250cm9sIGV0dGknLCBBcHByb3ZlZDogJ09uYXlsxLEnIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbdGhpcy5hbmFseXNpcz8uc3RhdHVzIHx8ICcnXSB8fCAnJztcclxuICB9XHJcblxyXG4gIGFsbG93ZWQocGVybWlzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5nZXRHcmFudGVkUG9saWN5KGBLYWxpdGUuUHJvY2Vzc0FuYWx5c2lzLiR7cGVybWlzc2lvbn1gKTtcclxuICB9XHJcblxyXG4gIGxvYWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmFjaWxpdHlDb2RlIHx8ICF0aGlzLmJ1c2luZXNzRGF0ZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcclxuICAgIHRoaXMuYnVzeVRleHQgPSAnQW5hbGl6IHZlcmlsZXJpIHnDvGtsZW5peW9y4oCmJztcclxuICAgIHRoaXMuZXJyb3IgPSAnJztcclxuICAgIHRoaXMuYXBpLnByb2Nlc3ModGhpcy5mYWNpbGl0eUNvZGUsIHRoaXMuYnVzaW5lc3NEYXRlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBhbmFseXNpcyA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBseUFuYWx5c2lzKGFuYWx5c2lzKTtcclxuICAgICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5lcnJvciA9ICdBbmFsaXogZm9ybXUgecO8a2xlbmVtZWRpLic7IHRoaXMuYnVzeSA9IGZhbHNlOyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5QW5hbHlzaXMoYW5hbHlzaXM6IFF1YWxpdHlBbmFseXNpcyk6IHZvaWQge1xyXG4gICAgdGhpcy5hbmFseXNpcyA9IGFuYWx5c2lzO1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPSBhbmFseXNpcy50ZW1wbGF0ZVNuYXBzaG90O1xyXG4gICAgdGhpcy5ncm91cHMgPSBbLi4udGVtcGxhdGUuc3RlcHNdLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAoc3RlcCA9PiAoe1xyXG4gICAgICBzdGVwLFxyXG4gICAgICBwYXJhbWV0ZXJzOiB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLmZpbHRlcihwID0+IHAuYWN0aXZlICYmIHAuc3RlcENvZGUgPT09IHN0ZXAucHJvY2Vzc0NvZGUpXHJcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKSxcclxuICAgIH0pKTtcclxuICAgIHRoaXMucGFyYW1ldGVycyA9IChbXSBhcyBRdWFsaXR5UGFyYW1ldGVyW10pLmNvbmNhdCguLi50aGlzLmdyb3Vwcy5tYXAoZ3JvdXAgPT4gZ3JvdXAucGFyYW1ldGVycykpO1xyXG4gICAgZm9yIChjb25zdCBob3VyIG9mIGFuYWx5c2lzLmhvdXJzKSB7XHJcbiAgICAgIGhvdXIubWVhc3VyZW1lbnRzIHx8PSBbXTtcclxuICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgdGhpcy5wYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgaWYgKCFob3VyLm1lYXN1cmVtZW50cy5zb21lKHYgPT4gdi5wYXJhbWV0ZXJDb2RlID09PSBwYXJhbWV0ZXIuY29kZSkpIHtcclxuICAgICAgICAgIGhvdXIubWVhc3VyZW1lbnRzLnB1c2goeyBwYXJhbWV0ZXJDb2RlOiBwYXJhbWV0ZXIuY29kZSwgbnVtYmVyOiBudWxsLCB0ZXh0OiAnJywgb3V0T2ZMaW1pdDogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtZWFzdXJlbWVudChyb3c6IFF1YWxpdHlIb3VyLCBwYXJhbWV0ZXI6IFF1YWxpdHlQYXJhbWV0ZXIpOiBRdWFsaXR5TWVhc3VyZW1lbnQge1xyXG4gICAgcmV0dXJuIHJvdy5tZWFzdXJlbWVudHMuZmluZCh2ID0+IHYucGFyYW1ldGVyQ29kZSA9PT0gcGFyYW1ldGVyLmNvZGUpITtcclxuICB9XHJcblxyXG4gIGxpbWl0KHBhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlcik6IFF1YWxpdHlMaW1pdCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gYXBwbGljYWJsZUxpbWl0KHRoaXMuYW5hbHlzaXM/LnRlbXBsYXRlU25hcHNob3QubGltaXRzIHx8IFtdLCBwYXJhbWV0ZXIuY29kZSwgdGhpcy5idXNpbmVzc0RhdGUsIHRoaXMuYW5hbHlzaXM/Lm9pbFR5cGUgfHwgJycpO1xyXG4gIH1cclxuXHJcbiAgbGltaXRMYWJlbChwYXJhbWV0ZXI6IFF1YWxpdHlQYXJhbWV0ZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbGltaXQgPSB0aGlzLmxpbWl0KHBhcmFtZXRlcik7XHJcbiAgICBpZiAoIWxpbWl0KSByZXR1cm4gJ+KAlCc7XHJcbiAgICBpZiAobGltaXQuZXhwZWN0ZWRUZXh0KSByZXR1cm4gbGltaXQuZXhwZWN0ZWRUZXh0O1xyXG4gICAgaWYgKGxpbWl0Lm1pbmltdW0gIT0gbnVsbCAmJiBsaW1pdC5tYXhpbXVtICE9IG51bGwpIHJldHVybiBgJHtsaW1pdC5taW5pbXVtfeKAkyR7bGltaXQubWF4aW11bX1gO1xyXG4gICAgaWYgKGxpbWl0Lm1pbmltdW0gIT0gbnVsbCkgcmV0dXJuIGDiiaUgJHtsaW1pdC5taW5pbXVtfWA7XHJcbiAgICBpZiAobGltaXQubWF4aW11bSAhPSBudWxsKSByZXR1cm4gYOKJpCAke2xpbWl0Lm1heGltdW19YDtcclxuICAgIHJldHVybiAn4oCUJztcclxuICB9XHJcblxyXG4gIGNoYW5nZWQocm93OiBRdWFsaXR5SG91ciwgcGFyYW1ldGVyOiBRdWFsaXR5UGFyYW1ldGVyKTogdm9pZCB7XHJcbiAgICB0cnkgeyByZWNhbGN1bGF0ZSh0aGlzLnBhcmFtZXRlcnMsIHJvdy5tZWFzdXJlbWVudHMsIHRoaXMuYW5hbHlzaXM/LnRlbXBsYXRlU25hcHNob3QubGltaXRzIHx8IFtdLCB0aGlzLmJ1c2luZXNzRGF0ZSwgdGhpcy5hbmFseXNpcz8ub2lsVHlwZSB8fCAnJyk7IH1cclxuICAgIGNhdGNoIChlKSB7IHRoaXMuZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiAnSGVzYXBsYW1hIHlhcMSxbGFtYWTEsS4nOyB9XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWVhc3VyZW1lbnQocm93LCBwYXJhbWV0ZXIpO1xyXG4gICAgY29uc3QgbGltaXQgPSB0aGlzLmxpbWl0KHBhcmFtZXRlcik7XHJcbiAgICB2YWx1ZS5vdXRPZkxpbWl0ID0gISFsaW1pdCAmJiAoXHJcbiAgICAgICh2YWx1ZS5udW1iZXIgIT0gbnVsbCAmJlxyXG4gICAgICAgICgobGltaXQubWluaW11bSAhPSBudWxsICYmIHZhbHVlLm51bWJlciA8IGxpbWl0Lm1pbmltdW0pIHx8XHJcbiAgICAgICAgIChsaW1pdC5tYXhpbXVtICE9IG51bGwgJiYgdmFsdWUubnVtYmVyID4gbGltaXQubWF4aW11bSkpKSB8fFxyXG4gICAgICAoISF2YWx1ZS50ZXh0ICYmICEhbGltaXQuZXhwZWN0ZWRUZXh0ICYmXHJcbiAgICAgICAgdmFsdWUudGV4dC50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoJ3RyLVRSJykgIT09IGxpbWl0LmV4cGVjdGVkVGV4dC50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoJ3RyLVRSJykpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb2lsVHlwZUNoYW5nZWQoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLmFuYWx5c2lzPy5ob3VycyB8fCBbXSlcclxuICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgdGhpcy5wYXJhbWV0ZXJzKVxyXG4gICAgICAgIHRoaXMuY2hhbmdlZChyb3csIHBhcmFtZXRlcik7XHJcbiAgfVxyXG5cclxuICBhdmVyYWdlKHBhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmFuYWx5c2lzPy5ob3Vycy5tYXAoaCA9PiB0aGlzLm1lYXN1cmVtZW50KGgsIHBhcmFtZXRlcikubnVtYmVyKVxyXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBudW1iZXIgPT4gdiAhPSBudWxsKSB8fCBbXTtcclxuICAgIGlmICghdmFsdWVzLmxlbmd0aCkgcmV0dXJuICfigJQnO1xyXG4gICAgcmV0dXJuICh2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyB2YWx1ZXMubGVuZ3RoKS50b0ZpeGVkKHBhcmFtZXRlci5kZWNpbWFsUGxhY2VzKTtcclxuICB9XHJcblxyXG4gIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYW5hbHlzaXMgfHwgIXRoaXMuZWRpdGFibGUpIHJldHVybjtcclxuICAgIHRoaXMuYnVzeSA9IHRydWU7XHJcbiAgICB0aGlzLmJ1c3lUZXh0ID0gJ0Zvcm0ga2F5ZGVkaWxpeW9y4oCmJztcclxuICAgIHRoaXMuZXJyb3IgPSAnJztcclxuICAgIGNvbnN0IGlucHV0ID0ge1xyXG4gICAgICBmYWNpbGl0eUNvZGU6IHRoaXMuYW5hbHlzaXMuZmFjaWxpdHlDb2RlLFxyXG4gICAgICBidXNpbmVzc0RhdGU6IHRoaXMuYnVzaW5lc3NEYXRlLFxyXG4gICAgICBvaWxUeXBlOiB0aGlzLmFuYWx5c2lzLm9pbFR5cGUsXHJcbiAgICAgIG5vdGVzOiB0aGlzLmFuYWx5c2lzLm5vdGVzLFxyXG4gICAgICByZXZpc2lvbjogdGhpcy5hbmFseXNpcy5yZXZpc2lvbixcclxuICAgICAgaG91cnM6IHRoaXMuYW5hbHlzaXMuaG91cnMsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5hcGkuc2F2ZVByb2Nlc3MoaW5wdXQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGFuYWx5c2lzID0+IHsgdGhpcy5hcHBseUFuYWx5c2lzKGFuYWx5c2lzKTsgdGhpcy5idXN5ID0gZmFsc2U7IH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuZXJyb3IgPSAnRm9ybSBrYXlkZWRpbGVtZWRpLiBBbGFubGFyxLEgdmUgYmHEn2xhbnTEsXnEsSBrb250cm9sIGVkaW4uJzsgdGhpcy5idXN5ID0gZmFsc2U7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlY2lzaW9uKGFjdGlvbjogJ3NpZ24nIHwgJ2NoZWNrJyB8ICdhcHByb3ZlJyB8ICdyZXZva2UnKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYW5hbHlzaXMgfHwgIXRoaXMuYW5hbHlzaXMucmV2aXNpb24pIHJldHVybjtcclxuICAgIGlmICgoYWN0aW9uID09PSAncmV2b2tlJyB8fCAoYWN0aW9uID09PSAnYXBwcm92ZScgJiYgdGhpcy5oYXNPdXRPZkxpbWl0KSkgJiYgIXRoaXMucmVhc29uLnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnJlYXNvbkVycm9yID0gJ0J1IGnFn2xlbSBpw6dpbiBnZXJla8OnZSBnaXJpbi4nO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVhc29uSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYnVzeSA9IHRydWU7XHJcbiAgICB0aGlzLmJ1c3lUZXh0ID0gJ8SwxZ9sZW0gdGFtYW1sYW7EsXlvcuKApic7XHJcbiAgICB0aGlzLmVycm9yID0gJyc7XHJcbiAgICB0aGlzLnJlYXNvbkVycm9yID0gJyc7XHJcbiAgICB0aGlzLmFwaS5kZWNpc2lvbih0aGlzLmFuYWx5c2lzLmNvZGUsIGFjdGlvbiwgdGhpcy5hbmFseXNpcy5yZXZpc2lvbiwgdGhpcy5yZWFzb24pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGFuYWx5c2lzID0+IHsgdGhpcy5yZWFzb24gPSAnJzsgdGhpcy5hcHBseUFuYWx5c2lzKGFuYWx5c2lzKTsgdGhpcy5idXN5ID0gZmFsc2U7IH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuZXJyb3IgPSAnxLDFn2xlbSB0YW1hbWxhbmFtYWTEsS4gRm9ybXVuIHNvbiBkdXJ1bXVudSBrb250cm9sIGVkaW4uJzsgdGhpcy5idXN5ID0gZmFsc2U7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkUGRmKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFuYWx5c2lzPy5yZXZpc2lvbikgcmV0dXJuO1xyXG4gICAgdGhpcy5hcGkucGRmKHRoaXMuYW5hbHlzaXMuY29kZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYmxvYiA9PiB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgICBjb25zdCBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgYW5jaG9yLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgYW5jaG9yLmRvd25sb2FkID0gYCR7dGhpcy5hbmFseXNpcz8uZm9ybVNuYXBzaG90LmRvY3VtZW50Q29kZX0tJHt0aGlzLmFuYWx5c2lzPy5jb2RlfS5wZGZgO1xyXG4gICAgICAgIGFuY2hvci5jbGljaygpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpLCAxMDAwKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMuZXJyb3IgPSAnUERGIG9sdcWfdHVydWxhbWFkxLEuJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b2RheSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke1N0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKX1gO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cclxuICAgIDxoMyBjbGFzcz1cInBhZ2UtdGl0bGVcIj5SYWZpbmVyaSBQcm9zZXMgQW5hbGl6IEtvbnRyb2w8L2gzPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY2FyZCBtdC0yXCI+PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1lbmQgbWItM1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICA8bGFiZWwgZm9yPVwiZmFjaWxpdHlcIj5UZXNpczwvbGFiZWw+XHJcbiAgICAgICAgPHNlbGVjdCBpZD1cImZhY2lsaXR5XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiYnVzeVwiIFsobmdNb2RlbCldPVwiZmFjaWxpdHlDb2RlXCIgKGNoYW5nZSk9XCJsb2FkKClcIj5cclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZhY2lsaXR5IG9mIGZhY2lsaXRpZXNcIiBbdmFsdWVdPVwiZmFjaWxpdHkuY29kZVwiPnt7IGZhY2lsaXR5Lm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJidXNpbmVzc0RhdGVcIj7EsMWfIGfDvG7DvDwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IGlkPVwiYnVzaW5lc3NEYXRlXCIgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtkaXNhYmxlZF09XCJidXN5XCIgWyhuZ01vZGVsKV09XCJidXNpbmVzc0RhdGVcIiAoY2hhbmdlKT1cImxvYWQoKVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIiAqbmdJZj1cImFuYWx5c2lzPy5mYWNpbGl0eUNvZGUgPT09ICdERU8zJ1wiPlxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJvaWxUeXBlXCI+w5xyZXRpbGVuIHlhxJ8gY2luc2k8L2xhYmVsPlxyXG4gICAgICAgIDxzZWxlY3QgaWQ9XCJvaWxUeXBlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImFuYWx5c2lzIS5vaWxUeXBlXCIgKGNoYW5nZSk9XCJvaWxUeXBlQ2hhbmdlZCgpXCIgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZVwiPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlw6dpbml6PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIlBhbG0gT2lsXCI+UGFsbSBPaWw8L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJQYWxtIE9sZWluXCI+UGFsbSBPbGVpbjwvb3B0aW9uPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHRleHQtbWQtcmlnaHQgbXQtMiBtdC1tZC0wXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJhbmFseXNpc1wiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtaW5mbyBtci0yXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDZweDtcIj57eyBzdGF0dXNUZXh0IH19PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJkb3dubG9hZFBkZigpXCIgW2Rpc2FibGVkXT1cIiFhbmFseXNpcz8ucmV2aXNpb24gfHwgYnVzeVwiXHJcbiAgICAgICAgICAqbmdJZj1cImFsbG93ZWQoJ1ByaW50JylcIj5Gb3JtdSBZYXpkxLFyIChQREYpPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvciB9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInF1YWxpdHktZ3JpZC1sb2FkaW5nXCIgKm5nSWY9XCJidXN5XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYnVzeT1cInRydWVcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgIDxzcGFuPnt7IGJ1c3lUZXh0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYW5hbHlzaXNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWQgbWItMlwiPnt7IGFuYWx5c2lzLmZvcm1TbmFwc2hvdC5uYW1lIH19IMK3IHt7IGFuYWx5c2lzLmZvcm1TbmFwc2hvdC5kb2N1bWVudENvZGUgfX0gwrcgUmV2aXp5b24ge3sgYW5hbHlzaXMuZm9ybVNuYXBzaG90LnJldmlzaW9uTnVtYmVyIH19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWFsaXR5LWdyaWQtc2Nyb2xsXCIgW2hpZGRlbl09XCJidXN5XCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtc20gcXVhbGl0eS1ncmlkXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtY2VudGVyIGJnLWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIzXCIgY2xhc3M9XCJzdGlja3ktaG91clwiPlNhYXQ8L3RoPjx0aCByb3dzcGFuPVwiM1wiPlZhcmRpeWEgLyBMYWJvcmFudDwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIzXCI+QWzEsW5hbiBUYW5rIE5vPC90aD5cclxuICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3Vwc1wiIFthdHRyLmNvbHNwYW5dPVwiZ3JvdXAucGFyYW1ldGVycy5sZW5ndGhcIj57eyBncm91cC5zdGVwLm5hbWUgfX08L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiM1wiPkFrdGFyxLFsYW4gVGFuayBObzwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtY2VudGVyIGJnLWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHBhcmFtZXRlciBvZiBncm91cC5wYXJhbWV0ZXJzXCI+e3sgcGFyYW1ldGVyLm5hbWUgfX08c21hbGwgKm5nSWY9XCJwYXJhbWV0ZXIudW5pdFwiPiAoe3sgcGFyYW1ldGVyLnVuaXQgfX0pPC9zbWFsbD48L3RoPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBsaW1pdC1yb3dcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHNcIj5cclxuICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgcGFyYW1ldGVyIG9mIGdyb3VwLnBhcmFtZXRlcnNcIj57eyBsaW1pdExhYmVsKHBhcmFtZXRlcikgfX08L3RoPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgYW5hbHlzaXMuaG91cnNcIj5cclxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzdGlja3ktaG91clwiPnt7IHJvdy5ob3VyIHwgbnVtYmVyOicyLjAtMCcgfX06MDA8L3RoPjx0ZD48c21hbGw+e3tyb3cuc2hpZnRDb2RlfX08L3NtYWxsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbKG5nTW9kZWwpXT1cInJvdy5hbmFseXN0XCIgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZVwiIGFyaWEtbGFiZWw9XCJWYXJkaXlhIGxhYm9yYW50xLFcIiAvPjwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gdGFuay1pbnB1dFwiIGxpc3Q9XCJxdWFsaXR5VGFua3NcIiBbKG5nTW9kZWwpXT1cInJvdy5pbnRha2VUYW5rXCIgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZVwiIGFyaWEtbGFiZWw9XCJBbMSxbmFuIHRhbmtcIiAvPjwvdGQ+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHBhcmFtZXRlciBvZiBncm91cC5wYXJhbWV0ZXJzXCIgW2NsYXNzLm91dC1vZi1saW1pdF09XCJtZWFzdXJlbWVudChyb3csIHBhcmFtZXRlcikub3V0T2ZMaW1pdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJwYXJhbWV0ZXIudmFsdWVUeXBlID09PSAnTnVtYmVyJyB8fCBwYXJhbWV0ZXIuY2FsY3VsYXRlZFwiIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSB2YWx1ZS1pbnB1dFwiIFthdHRyLnN0ZXBdPVwiJ2FueSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWVhc3VyZW1lbnQocm93LCBwYXJhbWV0ZXIpLm51bWJlclwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZWQocm93LCBwYXJhbWV0ZXIpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlIHx8IHBhcmFtZXRlci5jYWxjdWxhdGVkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJwYXJhbWV0ZXIubmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJwYXJhbWV0ZXIudmFsdWVUeXBlID09PSAnQ2hvaWNlJyAmJiAhcGFyYW1ldGVyLmNhbGN1bGF0ZWRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gdmFsdWUtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWVhc3VyZW1lbnQocm93LCBwYXJhbWV0ZXIpLnRleHRcIiAoY2hhbmdlKT1cImNoYW5nZWQocm93LCBwYXJhbWV0ZXIpXCIgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48L29wdGlvbj48b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcGFyYW1ldGVyLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+e3sgb3B0aW9uIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJwYXJhbWV0ZXIudmFsdWVUeXBlID09PSAnVGV4dCcgJiYgIXBhcmFtZXRlci5jYWxjdWxhdGVkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHZhbHVlLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1lYXN1cmVtZW50KHJvdywgcGFyYW1ldGVyKS50ZXh0XCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlZChyb3csIHBhcmFtZXRlcilcIiBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInBhcmFtZXRlci5uYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPHRkPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gdGFuay1pbnB1dFwiIGxpc3Q9XCJxdWFsaXR5VGFua3NcIiBbKG5nTW9kZWwpXT1cInJvdy5vdXRwdXRUYW5rXCIgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZVwiIGFyaWEtbGFiZWw9XCJBa3RhcsSxbGFuIHRhbmtcIiAvPjwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDx0ciBjbGFzcz1cImF2ZXJhZ2Utcm93XCI+XHJcbiAgICAgICAgICAgICAgPHRoIGNvbHNwYW49XCIzXCI+T1JUQUxBTUE8L3RoPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3Vwc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBwYXJhbWV0ZXIgb2YgZ3JvdXAucGFyYW1ldGVyc1wiPnt7IHBhcmFtZXRlci52YWx1ZVR5cGUgPT09ICdOdW1iZXInID8gYXZlcmFnZShwYXJhbWV0ZXIpIDogJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm5vdGVzXCI+e3sgYW5hbHlzaXMuZm9ybVNuYXBzaG90LmNvZGUgPT09ICdGUjUyJyA/ICdBw6fEsWtsYW1hIC8gQmlsZ2knIDogJ05vdGxhcicgfX08L2xhYmVsPlxyXG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwibm90ZXNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCIzXCIgWyhuZ01vZGVsKV09XCJhbmFseXNpcy5ub3Rlc1wiIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIj48L3RleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInJlYXNvblwiPk9uYXkgLyBnZXJpIGFsbWEgZ2VyZWvDp2VzaTwvbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgI3JlYXNvbklucHV0IGlkPVwicmVhc29uXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiM1wiIFsobmdNb2RlbCldPVwicmVhc29uXCIgKG5nTW9kZWxDaGFuZ2UpPVwicmVhc29uRXJyb3IgPSAnJ1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInJlYXNvbkVycm9yXCIgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIiEhcmVhc29uRXJyb3JcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCBhbmFseXNpcy5zdGF0dXMgPT09ICdMYWJvcmFudFNpZ25lZCdcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlYXNvbkVycm9yXCIgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIGQtYmxvY2tcIiByb2xlPVwiYWxlcnRcIj57eyByZWFzb25FcnJvciB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTMgZC1mbGV4IGZsZXgtd3JhcCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTIgbWItMlwiIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlIHx8IGJ1c3lcIj5LYXlkZXQ8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbXItMiBtYi0yXCIgKm5nSWY9XCJhbmFseXNpcy5zdGF0dXMgPT09ICdEcmFmdCcgJiYgYWxsb3dlZCgnU2lnbicpXCJcclxuICAgICAgICAgIChjbGljayk9XCJkZWNpc2lvbignc2lnbicpXCIgW2Rpc2FibGVkXT1cIiFhbmFseXNpcy5yZXZpc2lvbiB8fCBidXN5XCI+TGFib3JhbnQgT2xhcmFrIMSwbXphbGE8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbXItMiBtYi0yXCIgKm5nSWY9XCJhbmFseXNpcy5zdGF0dXMgPT09ICdMYWJvcmFudFNpZ25lZCcgJiYgYWxsb3dlZCgnQ2hlY2snKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZGVjaXNpb24oJ2NoZWNrJylcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPk3DvGhlbmRpcyBLb250cm9sw7w8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzIG1yLTIgbWItMlwiICpuZ0lmPVwiYW5hbHlzaXMuc3RhdHVzID09PSAnQ2hlY2tlZCcgJiYgYWxsb3dlZCgnQXBwcm92ZScpXCJcclxuICAgICAgICAgIChjbGljayk9XCJkZWNpc2lvbignYXBwcm92ZScpXCIgW2Rpc2FibGVkXT1cImJ1c3lcIj5Tb24gT25heTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFuZ2VyIG1yLTIgbWItMlwiICpuZ0lmPVwiYW5hbHlzaXMuc3RhdHVzID09PSAnQXBwcm92ZWQnICYmIGFsbG93ZWQoJ1Jldm9rZScpXCJcclxuICAgICAgICAgIChjbGljayk9XCJkZWNpc2lvbigncmV2b2tlJylcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPk9uYXnEsSBHZXJpIEFsPC9idXR0b24+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJoYXNPdXRPZkxpbWl0XCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtYi0yXCI+TGltaXQgZMSxxZ/EsSDDtmzDp8O8bSB2YXIuIFNvbiBvbmF5IGnDp2luIGdlcmVrw6dlIGdlcmVrbGkuPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTMgc21hbGwgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgIDxzcGFuPkxhYm9yYW50OiB7eyBhbmFseXNpcy5sYWJvcmFudD8udXNlck5hbWUgfHwgJ+KAlCcgfX08L3NwYW4+IMK3XHJcbiAgICAgICAgPHNwYW4+TcO8aGVuZGlzOiB7eyBhbmFseXNpcy5lbmdpbmVlcj8udXNlck5hbWUgfHwgJ+KAlCcgfX08L3NwYW4+IMK3XHJcbiAgICAgICAgPHNwYW4+T25heWxheWFuOiB7eyBhbmFseXNpcy5hcHByb3Zlcj8udXNlck5hbWUgfHwgJ+KAlCcgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGV0YWlscyBjbGFzcz1cIm10LTNcIiAqbmdJZj1cImFuYWx5c2lzLmhpc3Rvcnk/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDxzdW1tYXJ5PsSwxZ9sZW0gZ2XDp21pxZ9pPC9zdW1tYXJ5PlxyXG4gICAgICAgIDx1bCBjbGFzcz1cIm10LTJcIj48bGkgKm5nRm9yPVwibGV0IGV2ZW50IG9mIGFuYWx5c2lzLmhpc3RvcnlcIj57eyBldmVudC5hY3Rpb24gfX0gwrcge3sgZXZlbnQudXNlck5hbWUgfX0gwrcge3sgZXZlbnQub2NjdXJyZWRBdCB8IGRhdGU6J2RkLk1NLnl5eXkgSEg6bW0nIH19PHNwYW4gKm5nSWY9XCJldmVudC5yZWFzb25cIj4gwrcge3sgZXZlbnQucmVhc29uIH19PC9zcGFuPjwvbGk+PC91bD5cclxuICAgICAgPC9kZXRhaWxzPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRhdGFsaXN0IGlkPVwicXVhbGl0eVRhbmtzXCI+PG9wdGlvbiAqbmdGb3I9XCJsZXQgdGFuayBvZiB0YW5rc1wiIFt2YWx1ZV09XCJ0YW5rLmNvZGVcIj57e3RhbmsubmFtZX19PC9vcHRpb24+PC9kYXRhbGlzdD5cclxuIl19
|