@hitsoft/kadooglu.kalite 0.0.0-stage → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,97 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { errorMessage } 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
|
+
import * as i5 from "@angular/router";
|
|
9
|
+
import * as i6 from "@abp/ng.theme.shared";
|
|
10
|
+
export class QualityDefinitionsComponent {
|
|
11
|
+
constructor(api, permissions) {
|
|
12
|
+
this.api = api;
|
|
13
|
+
this.permissions = permissions;
|
|
14
|
+
this.tab = 'details';
|
|
15
|
+
this.types = [];
|
|
16
|
+
this.details = [];
|
|
17
|
+
this.tanks = [];
|
|
18
|
+
this.shifts = [];
|
|
19
|
+
this.detail = null;
|
|
20
|
+
this.tank = null;
|
|
21
|
+
this.shift = null;
|
|
22
|
+
this.isNew = true;
|
|
23
|
+
this.busy = false;
|
|
24
|
+
this.error = '';
|
|
25
|
+
this.modalError = '';
|
|
26
|
+
this.success = '';
|
|
27
|
+
this.laborants = [];
|
|
28
|
+
this.laborantsBusy = false;
|
|
29
|
+
this.laborantsError = '';
|
|
30
|
+
this.profiles = [{ code: '', name: 'Soruları kendim tanımlayacağım' }, { code: 'RAW', name: 'Ham Ayçiçek Yağı' }, { code: 'REFINED', name: 'Rafine Yağ' }, { code: 'PALM', name: 'Palm Oil / Palm Olein' }, { code: 'COAL', name: 'Kömür' }, { code: 'NAOH', name: 'Kostik (NaOH)' }, { code: 'PHOSPHORIC', name: 'Fosforik Asit' }, { code: 'SULFURIC', name: 'Sülfürik Asit' }, { code: 'PERLITE', name: 'Perlit' }, { code: 'EARTH', name: 'Ağartma Toprağı' }];
|
|
31
|
+
}
|
|
32
|
+
get canEdit() { return this.permissions.getGrantedPolicy('Hitsoft.Kadooglu.Kalite.Definitions.Edit'); }
|
|
33
|
+
get canDelete() { return this.permissions.getGrantedPolicy('Hitsoft.Kadooglu.Kalite.Definitions.Delete'); }
|
|
34
|
+
ngOnInit() { this.load(); }
|
|
35
|
+
load() {
|
|
36
|
+
this.busy = true;
|
|
37
|
+
this.error = '';
|
|
38
|
+
if (this.tab === 'details') {
|
|
39
|
+
this.api.movementTypes().subscribe({ next: x => this.types = x, error: e => this.error = errorMessage(e) });
|
|
40
|
+
this.api.movementDetails().subscribe({ next: x => { this.details = x; this.busy = false; }, error: e => { this.error = errorMessage(e); this.busy = false; } });
|
|
41
|
+
}
|
|
42
|
+
else if (this.tab === 'tanks')
|
|
43
|
+
this.api.tanks().subscribe({ next: x => { this.tanks = x; this.busy = false; }, error: e => { this.error = errorMessage(e); this.busy = false; } });
|
|
44
|
+
else
|
|
45
|
+
this.api.shifts().subscribe({ next: x => { this.shifts = x; this.busy = false; }, error: e => { this.error = errorMessage(e); this.busy = false; } });
|
|
46
|
+
}
|
|
47
|
+
selectTab(tab) { this.tab = tab; this.close(); this.load(); }
|
|
48
|
+
name(code) { return this.types.find(x => x.code === code)?.name || code; }
|
|
49
|
+
openDetail(value) { this.error = ''; this.modalError = ''; this.isNew = !value; this.detail = value ? { ...value } : { code: '', movementTypeCode: '', detailCode: '', name: '', profile: '', active: true }; }
|
|
50
|
+
openTank(value) { this.error = ''; this.modalError = ''; this.isNew = !value; this.tank = value ? { ...value } : { code: '', name: '', type: 'Raw', capacity: null, active: true }; }
|
|
51
|
+
openShift(value) {
|
|
52
|
+
this.error = '';
|
|
53
|
+
this.modalError = '';
|
|
54
|
+
this.isNew = !value;
|
|
55
|
+
this.shift = value ? { ...value, analystUserId: value.analystUserId || null } : { code: '', name: '', startHour: 7, endHour: 15, analyst: '', analystUserId: null, active: true };
|
|
56
|
+
this.laborants = [];
|
|
57
|
+
this.laborantsBusy = true;
|
|
58
|
+
this.laborantsError = '';
|
|
59
|
+
this.api.laborants().subscribe({ next: x => { this.laborants = x; this.laborantsBusy = false; },
|
|
60
|
+
error: e => { this.laborantsError = errorMessage(e); this.laborantsBusy = false; } });
|
|
61
|
+
}
|
|
62
|
+
laborantChanged() {
|
|
63
|
+
if (this.shift)
|
|
64
|
+
this.shift.analyst = this.laborants.find(x => x.id === this.shift.analystUserId)?.userName || '';
|
|
65
|
+
}
|
|
66
|
+
get selectedLaborantMissing() { return !!this.shift?.analystUserId && !this.laborants.some(x => x.id === this.shift.analystUserId); }
|
|
67
|
+
close() { this.detail = null; this.tank = null; this.shift = null; this.modalError = ''; }
|
|
68
|
+
save() {
|
|
69
|
+
const value = this.detail || this.tank || this.shift;
|
|
70
|
+
if (!value)
|
|
71
|
+
return;
|
|
72
|
+
value.code = this.isNew ? value.code.trim().toUpperCase() : value.code;
|
|
73
|
+
this.busy = true;
|
|
74
|
+
this.modalError = '';
|
|
75
|
+
const request = this.detail ? this.api.saveDetail(this.detail, this.isNew) : this.tank ? this.api.saveTank(this.tank, this.isNew) : this.api.saveShift(this.shift);
|
|
76
|
+
request.subscribe({ next: () => { this.close(); this.success = 'Tanım kaydedildi.'; this.load(); }, error: e => { this.modalError = errorMessage(e); this.busy = false; } });
|
|
77
|
+
}
|
|
78
|
+
delete() {
|
|
79
|
+
const value = this.detail || this.tank || this.shift;
|
|
80
|
+
if (!value || this.isNew || this.busy)
|
|
81
|
+
return;
|
|
82
|
+
const type = this.detail ? 'araç hareket türü detayını' : this.tank ? 'tankı' : 'vardiyayı';
|
|
83
|
+
if (!confirm(`${value.code} kodlu ${type} ve bağlı tanımları kalıcı olarak silinsin mi?`))
|
|
84
|
+
return;
|
|
85
|
+
this.busy = true;
|
|
86
|
+
this.modalError = '';
|
|
87
|
+
const request = this.detail ? this.api.deleteDetail(value.code) : this.tank ? this.api.deleteTank(value.code) : this.api.deleteShift(value.code);
|
|
88
|
+
request.subscribe({ next: () => { this.close(); this.success = 'Tanım silindi.'; this.load(); }, error: e => { this.modalError = errorMessage(e); this.busy = false; } });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
QualityDefinitionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityDefinitionsComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
92
|
+
QualityDefinitionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityDefinitionsComponent, selector: "lib-quality-definitions", ngImport: i0, template: "<div class=\"container-fluid\"><h3>Kalite Tan\u0131mlar\u0131</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"d-flex justify-content-between mb-3\"><div class=\"btn-group\">\n <button class=\"btn\" [class.btn-primary]=\"tab === 'details'\" [class.btn-outline-secondary]=\"tab !== 'details'\" (click)=\"selectTab('details')\">Ara\u00E7 Hareket T\u00FCrleri Detay</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'tanks'\" [class.btn-outline-secondary]=\"tab !== 'tanks'\" (click)=\"selectTab('tanks')\">Tanklar</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'shifts'\" [class.btn-outline-secondary]=\"tab !== 'shifts'\" (click)=\"selectTab('shifts')\">Vardiyalar</button>\n </div><button class=\"btn btn-primary\" *ngIf=\"canEdit\" [disabled]=\"busy\" (click)=\"tab === 'details' ? openDetail() : tab === 'tanks' ? openTank() : openShift()\">+ Yeni Kay\u0131t</button></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div><div *ngIf=\"success\" class=\"alert alert-success\">{{ success }}</div><div *ngIf=\"busy\" class=\"quality-loading\" role=\"status\">Tan\u0131mlar y\u00FCkleniyor\u2026</div>\n <div class=\"table-responsive\" [hidden]=\"busy\">\n <table *ngIf=\"tab === 'details'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Ara\u00E7 Hareket T\u00FCr\u00FC</th><th>Detay Kodu</th><th>Detay Ad\u0131</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let d of details\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openDetail(d)\">D\u00FCzenle</button><a class=\"quality-questions-link\" [routerLink]=\"['/kalite/parameters']\" [queryParams]=\"{type: 'Input', detail: d.code}\">Kalite Sorular\u0131</a></td><td>{{ name(d.movementTypeCode) }}</td><td>{{ d.detailCode || '\u2014' }}</td><td>{{ d.name || '\u2014' }}</td><td>{{ d.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'tanks'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Tip</th><th>Kapasite</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let t of tanks\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openTank(t)\">D\u00FCzenle</button></td><td>{{ t.code }}</td><td>{{ t.name }}</td><td>{{ t.type === 'Raw' ? 'Ham Ya\u011F' : t.type === 'Refined' ? 'Rafine' : t.type === 'Product' ? '\u00DCr\u00FCn' : 'Ara' }}</td><td>{{ t.capacity }}</td><td>{{ t.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'shifts'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Ba\u015Flang\u0131\u00E7</th><th>Biti\u015F</th><th>Laborant</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let s of shifts\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openShift(s)\">D\u00FCzenle</button></td><td>{{ s.code }}</td><td>{{ s.name }}</td><td>{{ s.startHour | number:'2.0-0' }}:00</td><td>{{ s.endHour | number:'2.0-0' }}:00</td><td>{{ s.analyst }}</td><td>{{ s.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n </div><p *ngIf=\"tab === 'details'\" class=\"text-muted\">Etkin tan\u0131mlarda bulunan ara\u00E7 hareket t\u00FCrleri kalite kontrole tabidir. Detay kodu ve ad\u0131 bo\u015F b\u0131rak\u0131larak yaln\u0131z hareket t\u00FCr\u00FC ba\u015Fl\u0131\u011F\u0131 tan\u0131mlanabilir.</p>\n</div></div></div>\n<abp-modal [visible]=\"!!(detail || tank || shift)\" (visibleChange)=\"!$event && close()\" [busy]=\"busy\" [options]=\"{size: 'lg'}\">\n <ng-template #abpHeader><h5>{{ isNew ? 'Yeni Tan\u0131m' : 'Tan\u0131m\u0131 D\u00FCzenle' }}</h5></ng-template>\n <ng-template #abpBody><div *ngIf=\"modalError\" class=\"alert alert-danger\">{{ modalError }}</div>\n <div *ngIf=\"detail as d\" class=\"row\">\n <div class=\"col-md-4\"><label>Kay\u0131t Kodu *</label><input class=\"form-control\" [(ngModel)]=\"d.code\" [disabled]=\"!isNew\" maxlength=\"24\" /></div><div class=\"col-md-8\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC *</label><select class=\"form-control\" [(ngModel)]=\"d.movementTypeCode\" [disabled]=\"!isNew\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{ type.name }}</option></select></div>\n <div class=\"col-md-4 mt-3\"><label>Detay Kodu</label><input class=\"form-control\" [(ngModel)]=\"d.detailCode\" /></div><div class=\"col-md-8 mt-3\"><label>Detay Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"d.name\" /></div>\n <div class=\"col-md-12 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Sorular\u0131</label><select class=\"form-control\" [(ngModel)]=\"d.profile\" [disabled]=\"!isNew\"><option *ngFor=\"let p of profiles\" [value]=\"p.code\">{{ p.name }}</option></select><small class=\"text-muted\">Se\u00E7ilen \u015Fablonun sorular\u0131 ve limitleri Kalite Parametreleri ekran\u0131ndan d\u00FCzenlenebilir.</small></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"d.active\" /> Aktif</label></div>\n </div>\n <div *ngIf=\"tank as t\" class=\"row\"><div class=\"col-md-4\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"t.code\" [disabled]=\"!isNew\" /></div><div class=\"col-md-8\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"t.name\" /></div><div class=\"col-md-6 mt-3\"><label>Tip</label><select class=\"form-control\" [(ngModel)]=\"t.type\"><option value=\"Raw\">Ham Ya\u011F</option><option value=\"Refined\">Rafine</option><option value=\"Intermediate\">Ara</option><option value=\"Product\">\u00DCr\u00FCn</option></select></div><div class=\"col-md-6 mt-3\"><label>Kapasite</label><input type=\"number\" min=\"0\" class=\"form-control\" [(ngModel)]=\"t.capacity\" /></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"t.active\" /> Aktif</label></div></div>\n <div *ngIf=\"shift as s\" class=\"row\">\n <div class=\"col-md-3\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"s.code\" [disabled]=\"!isNew\" /></div>\n <div class=\"col-md-9\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"s.name\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.startHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Biti\u015F Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.endHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Laborant</label>\n <select class=\"form-control\" [(ngModel)]=\"s.analystUserId\" (change)=\"laborantChanged()\" [disabled]=\"busy || laborantsBusy\">\n <option [ngValue]=\"null\">{{ !s.analystUserId && s.analyst ? 'Mevcut: ' + s.analyst + ' (eski kay\u0131t)' : 'Se\u00E7in' }}</option>\n <option *ngIf=\"selectedLaborantMissing\" [ngValue]=\"s.analystUserId\" disabled>{{ s.analyst }} (se\u00E7ilebilir de\u011Fil)</option>\n <option *ngFor=\"let user of laborants\" [ngValue]=\"user.id\">{{ user.userName }}</option>\n </select>\n <small *ngIf=\"laborantsBusy\" class=\"text-muted\">Kullan\u0131c\u0131lar y\u00FCkleniyor\u2026</small>\n <small *ngIf=\"!laborantsBusy && !laborantsError && !laborants.length\" class=\"text-muted\">Bu firmada aktif ve proses veri giri\u015Fi yetkisi olan kullan\u0131c\u0131 bulunamad\u0131.</small>\n <div *ngIf=\"laborantsError\" class=\"text-danger\" role=\"alert\">{{ laborantsError }}</div>\n </div>\n <div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"s.active\" /> Aktif</label></div>\n </div>\n </ng-template><ng-template #abpFooter><button class=\"btn btn-danger mr-auto\" *ngIf=\"canDelete && !isNew\" [disabled]=\"busy\" (click)=\"delete()\">Sil</button><button class=\"btn btn-secondary\" [disabled]=\"busy\" (click)=\"close()\">Vazge\u00E7</button><button class=\"btn btn-primary\" [disabled]=\"busy\" (click)=\"save()\">Kaydet</button></ng-template>\n</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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][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.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i4.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { 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: "pipe", type: i3.DecimalPipe, name: "number" }] });
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityDefinitionsComponent, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{ selector: 'lib-quality-definitions', template: "<div class=\"container-fluid\"><h3>Kalite Tan\u0131mlar\u0131</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"d-flex justify-content-between mb-3\"><div class=\"btn-group\">\n <button class=\"btn\" [class.btn-primary]=\"tab === 'details'\" [class.btn-outline-secondary]=\"tab !== 'details'\" (click)=\"selectTab('details')\">Ara\u00E7 Hareket T\u00FCrleri Detay</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'tanks'\" [class.btn-outline-secondary]=\"tab !== 'tanks'\" (click)=\"selectTab('tanks')\">Tanklar</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'shifts'\" [class.btn-outline-secondary]=\"tab !== 'shifts'\" (click)=\"selectTab('shifts')\">Vardiyalar</button>\n </div><button class=\"btn btn-primary\" *ngIf=\"canEdit\" [disabled]=\"busy\" (click)=\"tab === 'details' ? openDetail() : tab === 'tanks' ? openTank() : openShift()\">+ Yeni Kay\u0131t</button></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div><div *ngIf=\"success\" class=\"alert alert-success\">{{ success }}</div><div *ngIf=\"busy\" class=\"quality-loading\" role=\"status\">Tan\u0131mlar y\u00FCkleniyor\u2026</div>\n <div class=\"table-responsive\" [hidden]=\"busy\">\n <table *ngIf=\"tab === 'details'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Ara\u00E7 Hareket T\u00FCr\u00FC</th><th>Detay Kodu</th><th>Detay Ad\u0131</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let d of details\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openDetail(d)\">D\u00FCzenle</button><a class=\"quality-questions-link\" [routerLink]=\"['/kalite/parameters']\" [queryParams]=\"{type: 'Input', detail: d.code}\">Kalite Sorular\u0131</a></td><td>{{ name(d.movementTypeCode) }}</td><td>{{ d.detailCode || '\u2014' }}</td><td>{{ d.name || '\u2014' }}</td><td>{{ d.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'tanks'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Tip</th><th>Kapasite</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let t of tanks\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openTank(t)\">D\u00FCzenle</button></td><td>{{ t.code }}</td><td>{{ t.name }}</td><td>{{ t.type === 'Raw' ? 'Ham Ya\u011F' : t.type === 'Refined' ? 'Rafine' : t.type === 'Product' ? '\u00DCr\u00FCn' : 'Ara' }}</td><td>{{ t.capacity }}</td><td>{{ t.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'shifts'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Ba\u015Flang\u0131\u00E7</th><th>Biti\u015F</th><th>Laborant</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let s of shifts\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openShift(s)\">D\u00FCzenle</button></td><td>{{ s.code }}</td><td>{{ s.name }}</td><td>{{ s.startHour | number:'2.0-0' }}:00</td><td>{{ s.endHour | number:'2.0-0' }}:00</td><td>{{ s.analyst }}</td><td>{{ s.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n </div><p *ngIf=\"tab === 'details'\" class=\"text-muted\">Etkin tan\u0131mlarda bulunan ara\u00E7 hareket t\u00FCrleri kalite kontrole tabidir. Detay kodu ve ad\u0131 bo\u015F b\u0131rak\u0131larak yaln\u0131z hareket t\u00FCr\u00FC ba\u015Fl\u0131\u011F\u0131 tan\u0131mlanabilir.</p>\n</div></div></div>\n<abp-modal [visible]=\"!!(detail || tank || shift)\" (visibleChange)=\"!$event && close()\" [busy]=\"busy\" [options]=\"{size: 'lg'}\">\n <ng-template #abpHeader><h5>{{ isNew ? 'Yeni Tan\u0131m' : 'Tan\u0131m\u0131 D\u00FCzenle' }}</h5></ng-template>\n <ng-template #abpBody><div *ngIf=\"modalError\" class=\"alert alert-danger\">{{ modalError }}</div>\n <div *ngIf=\"detail as d\" class=\"row\">\n <div class=\"col-md-4\"><label>Kay\u0131t Kodu *</label><input class=\"form-control\" [(ngModel)]=\"d.code\" [disabled]=\"!isNew\" maxlength=\"24\" /></div><div class=\"col-md-8\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC *</label><select class=\"form-control\" [(ngModel)]=\"d.movementTypeCode\" [disabled]=\"!isNew\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{ type.name }}</option></select></div>\n <div class=\"col-md-4 mt-3\"><label>Detay Kodu</label><input class=\"form-control\" [(ngModel)]=\"d.detailCode\" /></div><div class=\"col-md-8 mt-3\"><label>Detay Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"d.name\" /></div>\n <div class=\"col-md-12 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Sorular\u0131</label><select class=\"form-control\" [(ngModel)]=\"d.profile\" [disabled]=\"!isNew\"><option *ngFor=\"let p of profiles\" [value]=\"p.code\">{{ p.name }}</option></select><small class=\"text-muted\">Se\u00E7ilen \u015Fablonun sorular\u0131 ve limitleri Kalite Parametreleri ekran\u0131ndan d\u00FCzenlenebilir.</small></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"d.active\" /> Aktif</label></div>\n </div>\n <div *ngIf=\"tank as t\" class=\"row\"><div class=\"col-md-4\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"t.code\" [disabled]=\"!isNew\" /></div><div class=\"col-md-8\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"t.name\" /></div><div class=\"col-md-6 mt-3\"><label>Tip</label><select class=\"form-control\" [(ngModel)]=\"t.type\"><option value=\"Raw\">Ham Ya\u011F</option><option value=\"Refined\">Rafine</option><option value=\"Intermediate\">Ara</option><option value=\"Product\">\u00DCr\u00FCn</option></select></div><div class=\"col-md-6 mt-3\"><label>Kapasite</label><input type=\"number\" min=\"0\" class=\"form-control\" [(ngModel)]=\"t.capacity\" /></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"t.active\" /> Aktif</label></div></div>\n <div *ngIf=\"shift as s\" class=\"row\">\n <div class=\"col-md-3\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"s.code\" [disabled]=\"!isNew\" /></div>\n <div class=\"col-md-9\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"s.name\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.startHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Biti\u015F Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.endHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Laborant</label>\n <select class=\"form-control\" [(ngModel)]=\"s.analystUserId\" (change)=\"laborantChanged()\" [disabled]=\"busy || laborantsBusy\">\n <option [ngValue]=\"null\">{{ !s.analystUserId && s.analyst ? 'Mevcut: ' + s.analyst + ' (eski kay\u0131t)' : 'Se\u00E7in' }}</option>\n <option *ngIf=\"selectedLaborantMissing\" [ngValue]=\"s.analystUserId\" disabled>{{ s.analyst }} (se\u00E7ilebilir de\u011Fil)</option>\n <option *ngFor=\"let user of laborants\" [ngValue]=\"user.id\">{{ user.userName }}</option>\n </select>\n <small *ngIf=\"laborantsBusy\" class=\"text-muted\">Kullan\u0131c\u0131lar y\u00FCkleniyor\u2026</small>\n <small *ngIf=\"!laborantsBusy && !laborantsError && !laborants.length\" class=\"text-muted\">Bu firmada aktif ve proses veri giri\u015Fi yetkisi olan kullan\u0131c\u0131 bulunamad\u0131.</small>\n <div *ngIf=\"laborantsError\" class=\"text-danger\" role=\"alert\">{{ laborantsError }}</div>\n </div>\n <div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"s.active\" /> Aktif</label></div>\n </div>\n </ng-template><ng-template #abpFooter><button class=\"btn btn-danger mr-auto\" *ngIf=\"canDelete && !isNew\" [disabled]=\"busy\" (click)=\"delete()\">Sil</button><button class=\"btn btn-secondary\" [disabled]=\"busy\" (click)=\"close()\">Vazge\u00E7</button><button class=\"btn btn-primary\" [disabled]=\"busy\" (click)=\"save()\">Kaydet</button></ng-template>\n</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"] }]
|
|
96
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }]; } });
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eS1kZWZpbml0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rYWxpdGUvc3JjL2xpYi9jb21wb25lbnRzL3F1YWxpdHktZGVmaW5pdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2FsaXRlL3NyYy9saWIvY29tcG9uZW50cy9xdWFsaXR5LWRlZmluaXRpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7OztBQUdoRSxNQUFNLE9BQU8sMkJBQTJCO0lBS3RDLFlBQW9CLEdBQXNCLEVBQVUsV0FBOEI7UUFBOUQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFKbEYsUUFBRyxHQUFtQyxTQUFTLENBQUM7UUFBQyxVQUFLLEdBQW1CLEVBQUUsQ0FBQztRQUFDLFlBQU8sR0FBcUIsRUFBRSxDQUFDO1FBQUMsVUFBSyxHQUFrQixFQUFFLENBQUM7UUFBQyxXQUFNLEdBQW1CLEVBQUUsQ0FBQztRQUNwSyxXQUFNLEdBQTBCLElBQUksQ0FBQztRQUFDLFNBQUksR0FBdUIsSUFBSSxDQUFDO1FBQUMsVUFBSyxHQUF3QixJQUFJLENBQUM7UUFBQyxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBQUMsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUFDLFVBQUssR0FBRyxFQUFFLENBQUM7UUFBQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQUMsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNoTCxjQUFTLEdBQXNCLEVBQUUsQ0FBQztRQUFDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQUMsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDOUUsYUFBUSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxnQ0FBZ0MsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDelcsQ0FBQztJQUN0RixJQUFJLE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEgsSUFBSSxTQUFTLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BILFFBQVEsS0FBVyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLElBQUk7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pLO2FBQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLE9BQU87WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1lBQ2hMLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3SixDQUFDO0lBQ0QsU0FBUyxDQUFDLEdBQW1DLElBQVUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25HLElBQUksQ0FBQyxJQUFZLElBQVksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUYsVUFBVSxDQUFDLEtBQXNCLElBQVUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdE8sUUFBUSxDQUFDLEtBQW1CLElBQVUsSUFBSSxDQUFDLEtBQUss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Q0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDL0csTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLENBQUM7UUFDcEssT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9LLENBQUM7SUFDRCxNQUFNO1FBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLFVBQVUsSUFBSSxnREFBZ0QsQ0FBQztZQUFFLE9BQU87UUFDbEcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pKLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1SyxDQUFDOzt3SEFoRFUsMkJBQTJCOzRHQUEzQiwyQkFBMkIsK0RDUHhDLGtnUUF5Q0E7MkZEbENhLDJCQUEyQjtrQkFEdkMsU0FBUzsrQkFBYSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICdAYWJwL25nLmNvcmUnO1xuaW1wb3J0IHsgTW92ZW1lbnREZXRhaWwsIE1vdmVtZW50VHlwZSwgUXVhbGl0eVNoaWZ0LCBRdWFsaXR5VGFuaywgUXVhbGl0eUxhYm9yYW50IH0gZnJvbSAnLi4vbW9kZWxzL2ludGFrZS5tb2RlbHMnO1xuaW1wb3J0IHsgUXVhbGl0eUFwaVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWFsaXR5LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktbWVhc3VyZW1lbnRzJztcblxuQENvbXBvbmVudCh7IHNlbGVjdG9yOiAnbGliLXF1YWxpdHktZGVmaW5pdGlvbnMnLCB0ZW1wbGF0ZVVybDogJy4vcXVhbGl0eS1kZWZpbml0aW9ucy5jb21wb25lbnQuaHRtbCcsIHN0eWxlVXJsczogWycuL2ludGFrZS5jb21wb25lbnQuc2NzcyddIH0pXG5leHBvcnQgY2xhc3MgUXVhbGl0eURlZmluaXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdGFiOiAnZGV0YWlscycgfCAndGFua3MnIHwgJ3NoaWZ0cycgPSAnZGV0YWlscyc7IHR5cGVzOiBNb3ZlbWVudFR5cGVbXSA9IFtdOyBkZXRhaWxzOiBNb3ZlbWVudERldGFpbFtdID0gW107IHRhbmtzOiBRdWFsaXR5VGFua1tdID0gW107IHNoaWZ0czogUXVhbGl0eVNoaWZ0W10gPSBbXTtcbiAgZGV0YWlsOiBNb3ZlbWVudERldGFpbCB8IG51bGwgPSBudWxsOyB0YW5rOiBRdWFsaXR5VGFuayB8IG51bGwgPSBudWxsOyBzaGlmdDogUXVhbGl0eVNoaWZ0IHwgbnVsbCA9IG51bGw7IGlzTmV3ID0gdHJ1ZTsgYnVzeSA9IGZhbHNlOyBlcnJvciA9ICcnOyBtb2RhbEVycm9yID0gJyc7IHN1Y2Nlc3MgPSAnJztcbiAgbGFib3JhbnRzOiBRdWFsaXR5TGFib3JhbnRbXSA9IFtdOyBsYWJvcmFudHNCdXN5ID0gZmFsc2U7IGxhYm9yYW50c0Vycm9yID0gJyc7XG4gIHByb2ZpbGVzID0gW3sgY29kZTogJycsIG5hbWU6ICdTb3J1bGFyxLEga2VuZGltIHRhbsSxbWxheWFjYcSfxLFtJyB9LCB7IGNvZGU6ICdSQVcnLCBuYW1lOiAnSGFtIEF5w6dpw6dlayBZYcSfxLEnIH0sIHsgY29kZTogJ1JFRklORUQnLCBuYW1lOiAnUmFmaW5lIFlhxJ8nIH0sIHsgY29kZTogJ1BBTE0nLCBuYW1lOiAnUGFsbSBPaWwgLyBQYWxtIE9sZWluJyB9LCB7IGNvZGU6ICdDT0FMJywgbmFtZTogJ0vDtm3DvHInIH0sIHsgY29kZTogJ05BT0gnLCBuYW1lOiAnS29zdGlrIChOYU9IKScgfSwgeyBjb2RlOiAnUEhPU1BIT1JJQycsIG5hbWU6ICdGb3Nmb3JpayBBc2l0JyB9LCB7IGNvZGU6ICdTVUxGVVJJQycsIG5hbWU6ICdTw7xsZsO8cmlrIEFzaXQnIH0sIHsgY29kZTogJ1BFUkxJVEUnLCBuYW1lOiAnUGVybGl0JyB9LCB7IGNvZGU6ICdFQVJUSCcsIG5hbWU6ICdBxJ9hcnRtYSBUb3ByYcSfxLEnIH1dO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwaTogUXVhbGl0eUFwaVNlcnZpY2UsIHByaXZhdGUgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25TZXJ2aWNlKSB7fVxuICBnZXQgY2FuRWRpdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMuZ2V0R3JhbnRlZFBvbGljeSgnSGl0c29mdC5LYWRvb2dsdS5LYWxpdGUuRGVmaW5pdGlvbnMuRWRpdCcpOyB9XG4gIGdldCBjYW5EZWxldGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnBlcm1pc3Npb25zLmdldEdyYW50ZWRQb2xpY3koJ0hpdHNvZnQuS2Fkb29nbHUuS2FsaXRlLkRlZmluaXRpb25zLkRlbGV0ZScpOyB9XG4gIG5nT25Jbml0KCk6IHZvaWQgeyB0aGlzLmxvYWQoKTsgfVxuICBsb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuYnVzeSA9IHRydWU7IHRoaXMuZXJyb3IgPSAnJztcbiAgICBpZiAodGhpcy50YWIgPT09ICdkZXRhaWxzJykge1xuICAgICAgdGhpcy5hcGkubW92ZW1lbnRUeXBlcygpLnN1YnNjcmliZSh7IG5leHQ6IHggPT4gdGhpcy50eXBlcyA9IHgsIGVycm9yOiBlID0+IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSkgfSk7XG4gICAgICB0aGlzLmFwaS5tb3ZlbWVudERldGFpbHMoKS5zdWJzY3JpYmUoeyBuZXh0OiB4ID0+IHsgdGhpcy5kZXRhaWxzID0geDsgdGhpcy5idXN5ID0gZmFsc2U7IH0sIGVycm9yOiBlID0+IHsgdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhpcy5idXN5ID0gZmFsc2U7IH0gfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRhYiA9PT0gJ3RhbmtzJykgdGhpcy5hcGkudGFua3MoKS5zdWJzY3JpYmUoeyBuZXh0OiB4ID0+IHsgdGhpcy50YW5rcyA9IHg7IHRoaXMuYnVzeSA9IGZhbHNlOyB9LCBlcnJvcjogZSA9PiB7IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7IHRoaXMuYnVzeSA9IGZhbHNlOyB9IH0pO1xuICAgIGVsc2UgdGhpcy5hcGkuc2hpZnRzKCkuc3Vic2NyaWJlKHsgbmV4dDogeCA9PiB7IHRoaXMuc2hpZnRzID0geDsgdGhpcy5idXN5ID0gZmFsc2U7IH0sIGVycm9yOiBlID0+IHsgdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhpcy5idXN5ID0gZmFsc2U7IH0gfSk7XG4gIH1cbiAgc2VsZWN0VGFiKHRhYjogJ2RldGFpbHMnIHwgJ3RhbmtzJyB8ICdzaGlmdHMnKTogdm9pZCB7IHRoaXMudGFiID0gdGFiOyB0aGlzLmNsb3NlKCk7IHRoaXMubG9hZCgpOyB9XG4gIG5hbWUoY29kZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudHlwZXMuZmluZCh4ID0+IHguY29kZSA9PT0gY29kZSk/Lm5hbWUgfHwgY29kZTsgfVxuICBvcGVuRGV0YWlsKHZhbHVlPzogTW92ZW1lbnREZXRhaWwpOiB2b2lkIHsgdGhpcy5lcnJvciA9ICcnOyB0aGlzLm1vZGFsRXJyb3IgPSAnJzsgdGhpcy5pc05ldyA9ICF2YWx1ZTsgdGhpcy5kZXRhaWwgPSB2YWx1ZSA/IHsgLi4udmFsdWUgfSA6IHsgY29kZTogJycsIG1vdmVtZW50VHlwZUNvZGU6ICcnLCBkZXRhaWxDb2RlOiAnJywgbmFtZTogJycsIHByb2ZpbGU6ICcnLCBhY3RpdmU6IHRydWUgfTsgfVxuICBvcGVuVGFuayh2YWx1ZT86IFF1YWxpdHlUYW5rKTogdm9pZCB7IHRoaXMuZXJyb3IgPSAnJzsgdGhpcy5tb2RhbEVycm9yID0gJyc7IHRoaXMuaXNOZXcgPSAhdmFsdWU7IHRoaXMudGFuayA9IHZhbHVlID8geyAuLi52YWx1ZSB9IDogeyBjb2RlOiAnJywgbmFtZTogJycsIHR5cGU6ICdSYXcnLCBjYXBhY2l0eTogbnVsbCwgYWN0aXZlOiB0cnVlIH07IH1cbiAgb3BlblNoaWZ0KHZhbHVlPzogUXVhbGl0eVNoaWZ0KTogdm9pZCB7XG4gICAgdGhpcy5lcnJvciA9ICcnOyB0aGlzLm1vZGFsRXJyb3IgPSAnJztcbiAgICB0aGlzLmlzTmV3ID0gIXZhbHVlO1xuICAgIHRoaXMuc2hpZnQgPSB2YWx1ZSA/IHsgLi4udmFsdWUsIGFuYWx5c3RVc2VySWQ6IHZhbHVlLmFuYWx5c3RVc2VySWQgfHwgbnVsbCB9IDogeyBjb2RlOiAnJywgbmFtZTogJycsIHN0YXJ0SG91cjogNywgZW5kSG91cjogMTUsIGFuYWx5c3Q6ICcnLCBhbmFseXN0VXNlcklkOiBudWxsLCBhY3RpdmU6IHRydWUgfTtcbiAgICB0aGlzLmxhYm9yYW50cyA9IFtdOyB0aGlzLmxhYm9yYW50c0J1c3kgPSB0cnVlOyB0aGlzLmxhYm9yYW50c0Vycm9yID0gJyc7XG4gICAgdGhpcy5hcGkubGFib3JhbnRzKCkuc3Vic2NyaWJlKHsgbmV4dDogeCA9PiB7IHRoaXMubGFib3JhbnRzID0geDsgdGhpcy5sYWJvcmFudHNCdXN5ID0gZmFsc2U7IH0sXG4gICAgICBlcnJvcjogZSA9PiB7IHRoaXMubGFib3JhbnRzRXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7IHRoaXMubGFib3JhbnRzQnVzeSA9IGZhbHNlOyB9IH0pO1xuICB9XG4gIGxhYm9yYW50Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaGlmdCkgdGhpcy5zaGlmdC5hbmFseXN0ID0gdGhpcy5sYWJvcmFudHMuZmluZCh4ID0+IHguaWQgPT09IHRoaXMuc2hpZnQhLmFuYWx5c3RVc2VySWQpPy51c2VyTmFtZSB8fCAnJztcbiAgfVxuICBnZXQgc2VsZWN0ZWRMYWJvcmFudE1pc3NpbmcoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuc2hpZnQ/LmFuYWx5c3RVc2VySWQgJiYgIXRoaXMubGFib3JhbnRzLnNvbWUoeCA9PiB4LmlkID09PSB0aGlzLnNoaWZ0IS5hbmFseXN0VXNlcklkKTsgfVxuICBjbG9zZSgpOiB2b2lkIHsgdGhpcy5kZXRhaWwgPSBudWxsOyB0aGlzLnRhbmsgPSBudWxsOyB0aGlzLnNoaWZ0ID0gbnVsbDsgdGhpcy5tb2RhbEVycm9yID0gJyc7IH1cbiAgc2F2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGV0YWlsIHx8IHRoaXMudGFuayB8fCB0aGlzLnNoaWZ0OyBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdmFsdWUuY29kZSA9IHRoaXMuaXNOZXcgPyB2YWx1ZS5jb2RlLnRyaW0oKS50b1VwcGVyQ2FzZSgpIDogdmFsdWUuY29kZTsgdGhpcy5idXN5ID0gdHJ1ZTsgdGhpcy5tb2RhbEVycm9yID0gJyc7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGV0YWlsID8gdGhpcy5hcGkuc2F2ZURldGFpbCh0aGlzLmRldGFpbCwgdGhpcy5pc05ldykgOiB0aGlzLnRhbmsgPyB0aGlzLmFwaS5zYXZlVGFuayh0aGlzLnRhbmssIHRoaXMuaXNOZXcpIDogdGhpcy5hcGkuc2F2ZVNoaWZ0KHRoaXMuc2hpZnQhKTtcbiAgICByZXF1ZXN0LnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHsgdGhpcy5jbG9zZSgpOyB0aGlzLnN1Y2Nlc3MgPSAnVGFuxLFtIGtheWRlZGlsZGkuJzsgdGhpcy5sb2FkKCk7IH0sIGVycm9yOiBlID0+IHsgdGhpcy5tb2RhbEVycm9yID0gZXJyb3JNZXNzYWdlKGUpOyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSB9KTtcbiAgfVxuICBkZWxldGUoKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRldGFpbCB8fCB0aGlzLnRhbmsgfHwgdGhpcy5zaGlmdDtcbiAgICBpZiAoIXZhbHVlIHx8IHRoaXMuaXNOZXcgfHwgdGhpcy5idXN5KSByZXR1cm47XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZGV0YWlsID8gJ2FyYcOnIGhhcmVrZXQgdMO8csO8IGRldGF5xLFuxLEnIDogdGhpcy50YW5rID8gJ3RhbmvEsScgOiAndmFyZGl5YXnEsSc7XG4gICAgaWYgKCFjb25maXJtKGAke3ZhbHVlLmNvZGV9IGtvZGx1ICR7dHlwZX0gdmUgYmHEn2zEsSB0YW7EsW1sYXLEsSBrYWzEsWPEsSBvbGFyYWsgc2lsaW5zaW4gbWk/YCkpIHJldHVybjtcbiAgICB0aGlzLmJ1c3kgPSB0cnVlOyB0aGlzLm1vZGFsRXJyb3IgPSAnJztcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5kZXRhaWwgPyB0aGlzLmFwaS5kZWxldGVEZXRhaWwodmFsdWUuY29kZSkgOiB0aGlzLnRhbmsgPyB0aGlzLmFwaS5kZWxldGVUYW5rKHZhbHVlLmNvZGUpIDogdGhpcy5hcGkuZGVsZXRlU2hpZnQodmFsdWUuY29kZSk7XG4gICAgcmVxdWVzdC5zdWJzY3JpYmUoeyBuZXh0OiAoKSA9PiB7IHRoaXMuY2xvc2UoKTsgdGhpcy5zdWNjZXNzID0gJ1RhbsSxbSBzaWxpbmRpLic7IHRoaXMubG9hZCgpOyB9LCBlcnJvcjogZSA9PiB7IHRoaXMubW9kYWxFcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhpcy5idXN5ID0gZmFsc2U7IH0gfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj48aDM+S2FsaXRlIFRhbsSxbWxhcsSxPC9oMz48ZGl2IGNsYXNzPVwiY2FyZFwiPjxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0zXCI+PGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBbY2xhc3MuYnRuLXByaW1hcnldPVwidGFiID09PSAnZGV0YWlscydcIiBbY2xhc3MuYnRuLW91dGxpbmUtc2Vjb25kYXJ5XT1cInRhYiAhPT0gJ2RldGFpbHMnXCIgKGNsaWNrKT1cInNlbGVjdFRhYignZGV0YWlscycpXCI+QXJhw6cgSGFyZWtldCBUw7xybGVyaSBEZXRheTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBbY2xhc3MuYnRuLXByaW1hcnldPVwidGFiID09PSAndGFua3MnXCIgW2NsYXNzLmJ0bi1vdXRsaW5lLXNlY29uZGFyeV09XCJ0YWIgIT09ICd0YW5rcydcIiAoY2xpY2spPVwic2VsZWN0VGFiKCd0YW5rcycpXCI+VGFua2xhcjwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBbY2xhc3MuYnRuLXByaW1hcnldPVwidGFiID09PSAnc2hpZnRzJ1wiIFtjbGFzcy5idG4tb3V0bGluZS1zZWNvbmRhcnldPVwidGFiICE9PSAnc2hpZnRzJ1wiIChjbGljayk9XCJzZWxlY3RUYWIoJ3NoaWZ0cycpXCI+VmFyZGl5YWxhcjwvYnV0dG9uPlxuICA8L2Rpdj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKm5nSWY9XCJjYW5FZGl0XCIgW2Rpc2FibGVkXT1cImJ1c3lcIiAoY2xpY2spPVwidGFiID09PSAnZGV0YWlscycgPyBvcGVuRGV0YWlsKCkgOiB0YWIgPT09ICd0YW5rcycgPyBvcGVuVGFuaygpIDogb3BlblNoaWZ0KClcIj4rIFllbmkgS2F5xLF0PC9idXR0b24+PC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+e3sgZXJyb3IgfX08L2Rpdj48ZGl2ICpuZ0lmPVwic3VjY2Vzc1wiIGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiPnt7IHN1Y2Nlc3MgfX08L2Rpdj48ZGl2ICpuZ0lmPVwiYnVzeVwiIGNsYXNzPVwicXVhbGl0eS1sb2FkaW5nXCIgcm9sZT1cInN0YXR1c1wiPlRhbsSxbWxhciB5w7xrbGVuaXlvcuKApjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIFtoaWRkZW5dPVwiYnVzeVwiPlxuICAgIDx0YWJsZSAqbmdJZj1cInRhYiA9PT0gJ2RldGFpbHMnXCIgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkXCI+PHRoZWFkPjx0cj48dGg+xLDFn2xlbWxlcjwvdGg+PHRoPkFyYcOnIEhhcmVrZXQgVMO8csO8PC90aD48dGg+RGV0YXkgS29kdTwvdGg+PHRoPkRldGF5IEFkxLE8L3RoPjx0aD5Ba3RpZjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHIgKm5nRm9yPVwibGV0IGQgb2YgZGV0YWlsc1wiPjx0ZD48YnV0dG9uICpuZ0lmPVwiY2FuRWRpdFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cIm9wZW5EZXRhaWwoZClcIj5Ew7x6ZW5sZTwvYnV0dG9uPjxhIGNsYXNzPVwicXVhbGl0eS1xdWVzdGlvbnMtbGlua1wiIFtyb3V0ZXJMaW5rXT1cIlsnL2thbGl0ZS9wYXJhbWV0ZXJzJ11cIiBbcXVlcnlQYXJhbXNdPVwie3R5cGU6ICdJbnB1dCcsIGRldGFpbDogZC5jb2RlfVwiPkthbGl0ZSBTb3J1bGFyxLE8L2E+PC90ZD48dGQ+e3sgbmFtZShkLm1vdmVtZW50VHlwZUNvZGUpIH19PC90ZD48dGQ+e3sgZC5kZXRhaWxDb2RlIHx8ICfigJQnIH19PC90ZD48dGQ+e3sgZC5uYW1lIHx8ICfigJQnIH19PC90ZD48dGQ+e3sgZC5hY3RpdmUgPyAnRXZldCcgOiAnSGF5xLFyJyB9fTwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+XG4gICAgPHRhYmxlICpuZ0lmPVwidGFiID09PSAndGFua3MnXCIgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkXCI+PHRoZWFkPjx0cj48dGg+xLDFn2xlbWxlcjwvdGg+PHRoPktvZDwvdGg+PHRoPkFkPC90aD48dGg+VGlwPC90aD48dGg+S2FwYXNpdGU8L3RoPjx0aD5Ba3RpZjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHIgKm5nRm9yPVwibGV0IHQgb2YgdGFua3NcIj48dGQ+PGJ1dHRvbiAqbmdJZj1cImNhbkVkaXRcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJvcGVuVGFuayh0KVwiPkTDvHplbmxlPC9idXR0b24+PC90ZD48dGQ+e3sgdC5jb2RlIH19PC90ZD48dGQ+e3sgdC5uYW1lIH19PC90ZD48dGQ+e3sgdC50eXBlID09PSAnUmF3JyA/ICdIYW0gWWHEnycgOiB0LnR5cGUgPT09ICdSZWZpbmVkJyA/ICdSYWZpbmUnIDogdC50eXBlID09PSAnUHJvZHVjdCcgPyAnw5xyw7xuJyA6ICdBcmEnIH19PC90ZD48dGQ+e3sgdC5jYXBhY2l0eSB9fTwvdGQ+PHRkPnt7IHQuYWN0aXZlID8gJ0V2ZXQnIDogJ0hhecSxcicgfX08L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPlxuICAgIDx0YWJsZSAqbmdJZj1cInRhYiA9PT0gJ3NoaWZ0cydcIiBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtYm9yZGVyZWRcIj48dGhlYWQ+PHRyPjx0aD7EsMWfbGVtbGVyPC90aD48dGg+S29kPC90aD48dGg+QWQ8L3RoPjx0aD5CYcWfbGFuZ8Sxw6c8L3RoPjx0aD5CaXRpxZ88L3RoPjx0aD5MYWJvcmFudDwvdGg+PHRoPkFrdGlmPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0ciAqbmdGb3I9XCJsZXQgcyBvZiBzaGlmdHNcIj48dGQ+PGJ1dHRvbiAqbmdJZj1cImNhbkVkaXRcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJvcGVuU2hpZnQocylcIj5Ew7x6ZW5sZTwvYnV0dG9uPjwvdGQ+PHRkPnt7IHMuY29kZSB9fTwvdGQ+PHRkPnt7IHMubmFtZSB9fTwvdGQ+PHRkPnt7IHMuc3RhcnRIb3VyIHwgbnVtYmVyOicyLjAtMCcgfX06MDA8L3RkPjx0ZD57eyBzLmVuZEhvdXIgfCBudW1iZXI6JzIuMC0wJyB9fTowMDwvdGQ+PHRkPnt7IHMuYW5hbHlzdCB9fTwvdGQ+PHRkPnt7IHMuYWN0aXZlID8gJ0V2ZXQnIDogJ0hhecSxcicgfX08L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPlxuICA8L2Rpdj48cCAqbmdJZj1cInRhYiA9PT0gJ2RldGFpbHMnXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+RXRraW4gdGFuxLFtbGFyZGEgYnVsdW5hbiBhcmHDpyBoYXJla2V0IHTDvHJsZXJpIGthbGl0ZSBrb250cm9sZSB0YWJpZGlyLiBEZXRheSBrb2R1IHZlIGFkxLEgYm/FnyBixLFyYWvEsWxhcmFrIHlhbG7EsXogaGFyZWtldCB0w7xyw7wgYmHFn2zEscSfxLEgdGFuxLFtbGFuYWJpbGlyLjwvcD5cbjwvZGl2PjwvZGl2PjwvZGl2PlxuPGFicC1tb2RhbCBbdmlzaWJsZV09XCIhIShkZXRhaWwgfHwgdGFuayB8fCBzaGlmdClcIiAodmlzaWJsZUNoYW5nZSk9XCIhJGV2ZW50ICYmIGNsb3NlKClcIiBbYnVzeV09XCJidXN5XCIgW29wdGlvbnNdPVwie3NpemU6ICdsZyd9XCI+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPjxoNT57eyBpc05ldyA/ICdZZW5pIFRhbsSxbScgOiAnVGFuxLFtxLEgRMO8emVubGUnIH19PC9oNT48L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2FicEJvZHk+PGRpdiAqbmdJZj1cIm1vZGFsRXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPnt7IG1vZGFsRXJyb3IgfX08L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiZGV0YWlsIGFzIGRcIiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkthecSxdCBLb2R1ICo8L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwiZC5jb2RlXCIgW2Rpc2FibGVkXT1cIiFpc05ld1wiIG1heGxlbmd0aD1cIjI0XCIgLz48L2Rpdj48ZGl2IGNsYXNzPVwiY29sLW1kLThcIj48bGFiZWw+QXJhw6cgSGFyZWtldCBUw7xyw7wgKjwvbGFiZWw+PHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwiZC5tb3ZlbWVudFR5cGVDb2RlXCIgW2Rpc2FibGVkXT1cIiFpc05ld1wiPjxvcHRpb24gdmFsdWU9XCJcIj5TZcOnaW48L29wdGlvbj48b3B0aW9uICpuZ0Zvcj1cImxldCB0eXBlIG9mIHR5cGVzXCIgW3ZhbHVlXT1cInR5cGUuY29kZVwiPnt7IHR5cGUubmFtZSB9fTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IG10LTNcIj48bGFiZWw+RGV0YXkgS29kdTwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkLmRldGFpbENvZGVcIiAvPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtOCBtdC0zXCI+PGxhYmVsPkRldGF5IEFkxLE8L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwiZC5uYW1lXCIgLz48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbXQtM1wiPjxsYWJlbD5CYcWfbGFuZ8Sxw6cgU29ydWxhcsSxPC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkLnByb2ZpbGVcIiBbZGlzYWJsZWRdPVwiIWlzTmV3XCI+PG9wdGlvbiAqbmdGb3I9XCJsZXQgcCBvZiBwcm9maWxlc1wiIFt2YWx1ZV09XCJwLmNvZGVcIj57eyBwLm5hbWUgfX08L29wdGlvbj48L3NlbGVjdD48c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+U2XDp2lsZW4gxZ9hYmxvbnVuIHNvcnVsYXLEsSB2ZSBsaW1pdGxlcmkgS2FsaXRlIFBhcmFtZXRyZWxlcmkgZWtyYW7EsW5kYW4gZMO8emVubGVuZWJpbGlyLjwvc21hbGw+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtdC0zXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImQuYWN0aXZlXCIgLz4gQWt0aWY8L2xhYmVsPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJ0YW5rIGFzIHRcIiBjbGFzcz1cInJvd1wiPjxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5Lb2QgKjwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJ0LmNvZGVcIiBbZGlzYWJsZWRdPVwiIWlzTmV3XCIgLz48L2Rpdj48ZGl2IGNsYXNzPVwiY29sLW1kLThcIj48bGFiZWw+QWQgKjwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJ0Lm5hbWVcIiAvPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtNiBtdC0zXCI+PGxhYmVsPlRpcDwvbGFiZWw+PHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwidC50eXBlXCI+PG9wdGlvbiB2YWx1ZT1cIlJhd1wiPkhhbSBZYcSfPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIlJlZmluZWRcIj5SYWZpbmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiSW50ZXJtZWRpYXRlXCI+QXJhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIlByb2R1Y3RcIj7DnHLDvG48L29wdGlvbj48L3NlbGVjdD48L2Rpdj48ZGl2IGNsYXNzPVwiY29sLW1kLTYgbXQtM1wiPjxsYWJlbD5LYXBhc2l0ZTwvbGFiZWw+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInQuY2FwYWNpdHlcIiAvPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbXQtM1wiPjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJ0LmFjdGl2ZVwiIC8+IEFrdGlmPC9sYWJlbD48L2Rpdj48L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hpZnQgYXMgc1wiIGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj48bGFiZWw+S29kICo8L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicy5jb2RlXCIgW2Rpc2FibGVkXT1cIiFpc05ld1wiIC8+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj48bGFiZWw+QWQgKjwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzLm5hbWVcIiAvPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IG10LTNcIj48bGFiZWw+QmHFn2xhbmfEscOnIFNhYXRpPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIyM1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzLnN0YXJ0SG91clwiIC8+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgbXQtM1wiPjxsYWJlbD5CaXRpxZ8gU2FhdGk8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjIzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInMuZW5kSG91clwiIC8+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgbXQtM1wiPjxsYWJlbD5MYWJvcmFudDwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInMuYW5hbHlzdFVzZXJJZFwiIChjaGFuZ2UpPVwibGFib3JhbnRDaGFuZ2VkKClcIiBbZGlzYWJsZWRdPVwiYnVzeSB8fCBsYWJvcmFudHNCdXN5XCI+XG4gICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3sgIXMuYW5hbHlzdFVzZXJJZCAmJiBzLmFuYWx5c3QgPyAnTWV2Y3V0OiAnICsgcy5hbmFseXN0ICsgJyAoZXNraSBrYXnEsXQpJyA6ICdTZcOnaW4nIH19PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInNlbGVjdGVkTGFib3JhbnRNaXNzaW5nXCIgW25nVmFsdWVdPVwicy5hbmFseXN0VXNlcklkXCIgZGlzYWJsZWQ+e3sgcy5hbmFseXN0IH19IChzZcOnaWxlYmlsaXIgZGXEn2lsKTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHVzZXIgb2YgbGFib3JhbnRzXCIgW25nVmFsdWVdPVwidXNlci5pZFwiPnt7IHVzZXIudXNlck5hbWUgfX08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxzbWFsbCAqbmdJZj1cImxhYm9yYW50c0J1c3lcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj5LdWxsYW7EsWPEsWxhciB5w7xrbGVuaXlvcuKApjwvc21hbGw+XG4gICAgICAgIDxzbWFsbCAqbmdJZj1cIiFsYWJvcmFudHNCdXN5ICYmICFsYWJvcmFudHNFcnJvciAmJiAhbGFib3JhbnRzLmxlbmd0aFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPkJ1IGZpcm1hZGEgYWt0aWYgdmUgcHJvc2VzIHZlcmkgZ2lyacWfaSB5ZXRraXNpIG9sYW4ga3VsbGFuxLFjxLEgYnVsdW5hbWFkxLEuPC9zbWFsbD5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxhYm9yYW50c0Vycm9yXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPnt7IGxhYm9yYW50c0Vycm9yIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbXQtM1wiPjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJzLmFjdGl2ZVwiIC8+IEFrdGlmPC9sYWJlbD48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT48bmctdGVtcGxhdGUgI2FicEZvb3Rlcj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgbXItYXV0b1wiICpuZ0lmPVwiY2FuRGVsZXRlICYmICFpc05ld1wiIFtkaXNhYmxlZF09XCJidXN5XCIgKGNsaWNrKT1cImRlbGV0ZSgpXCI+U2lsPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgW2Rpc2FibGVkXT1cImJ1c3lcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlZhemdlw6c8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cImJ1c3lcIiAoY2xpY2spPVwic2F2ZSgpXCI+S2F5ZGV0PC9idXR0b24+PC9uZy10ZW1wbGF0ZT5cbjwvYWJwLW1vZGFsPlxuIl19
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { errorMessage } from '../services/quality-measurements';
|
|
3
|
+
import { timer, of } from 'rxjs';
|
|
4
|
+
import { switchMap, catchError } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../services/quality-api.service";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i4 from "@abp/ng.core";
|
|
10
|
+
import * as i5 from "@angular/forms";
|
|
11
|
+
export class QualityNotificationsComponent {
|
|
12
|
+
constructor(api, router) {
|
|
13
|
+
this.api = api;
|
|
14
|
+
this.router = router;
|
|
15
|
+
this.items = [];
|
|
16
|
+
this.error = '';
|
|
17
|
+
}
|
|
18
|
+
ngOnInit() { this.api.notifications().subscribe({ next: x => this.items = x, error: e => this.error = errorMessage(e) }); }
|
|
19
|
+
read(n) { this.api.readNotification(n.code).subscribe({ next: () => n.isRead = true, error: e => this.error = errorMessage(e) }); }
|
|
20
|
+
open(n) { this.read(n); this.router.navigateByUrl(n.url); }
|
|
21
|
+
}
|
|
22
|
+
QualityNotificationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationsComponent, deps: [{ token: i1.QualityApiService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
23
|
+
QualityNotificationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityNotificationsComponent, selector: "lib-quality-notifications", ngImport: i0, template: `<div class="container-fluid"><h3>Kalite Bildirimleri</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div class="card mb-2" *ngFor="let n of items"><div class="card-body"><strong>{{n.title}}</strong> <span *ngIf="!n.isRead" class="badge badge-primary">Yeni</span><small class="float-right">{{n.createdAt | date:'dd.MM.yyyy HH:mm'}}</small><div class="mt-2" [innerHTML]="n.body"></div><button class="btn btn-outline-primary mt-2" (click)="open(n)">Kaydı Aç</button><button class="btn btn-outline-secondary mt-2 ml-2" *ngIf="!n.isRead" (click)="read(n)">Okundu İşaretle</button></div></div><p *ngIf="!items.length">Bildirim bulunmuyor.</p></div>`, isInline: true, 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: "pipe", type: i3.DatePipe, name: "date" }] });
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationsComponent, decorators: [{
|
|
25
|
+
type: Component,
|
|
26
|
+
args: [{ selector: 'lib-quality-notifications', template: `<div class="container-fluid"><h3>Kalite Bildirimleri</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div class="card mb-2" *ngFor="let n of items"><div class="card-body"><strong>{{n.title}}</strong> <span *ngIf="!n.isRead" class="badge badge-primary">Yeni</span><small class="float-right">{{n.createdAt | date:'dd.MM.yyyy HH:mm'}}</small><div class="mt-2" [innerHTML]="n.body"></div><button class="btn btn-outline-primary mt-2" (click)="open(n)">Kaydı Aç</button><button class="btn btn-outline-secondary mt-2 ml-2" *ngIf="!n.isRead" (click)="read(n)">Okundu İşaretle</button></div></div><p *ngIf="!items.length">Bildirim bulunmuyor.</p></div>` }]
|
|
27
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.Router }]; } });
|
|
28
|
+
export class QualityNotificationBellComponent {
|
|
29
|
+
constructor(api, config) {
|
|
30
|
+
this.api = api;
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.count = 0;
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() { this.subscription = this.config.getOne$('currentUser').pipe(switchMap(user => user?.isAuthenticated ? timer(0, 60000).pipe(switchMap(() => this.api.unreadNotifications().pipe(catchError(() => of(0))))) : of(0))).subscribe(count => this.count = count); }
|
|
35
|
+
ngOnDestroy() { this.subscription?.unsubscribe(); }
|
|
36
|
+
}
|
|
37
|
+
QualityNotificationBellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationBellComponent, deps: [{ token: i1.QualityApiService }, { token: i4.ConfigStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
QualityNotificationBellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityNotificationBellComponent, selector: "lib-quality-notification-bell", ngImport: i0, template: `<a class="nav-link position-relative" routerLink="/kalite/notifications" aria-label="Kalite bildirimleri"><i class="fas fa-bell" aria-hidden="true"></i><span class="badge badge-danger" *ngIf="count">{{count}}</span></a>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationBellComponent, decorators: [{
|
|
40
|
+
type: Component,
|
|
41
|
+
args: [{ selector: 'lib-quality-notification-bell', template: `<a class="nav-link position-relative" routerLink="/kalite/notifications" aria-label="Kalite bildirimleri"><i class="fas fa-bell" aria-hidden="true"></i><span class="badge badge-danger" *ngIf="count">{{count}}</span></a>` }]
|
|
42
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i4.ConfigStateService }]; } });
|
|
43
|
+
export class QualityNotificationSettingsComponent {
|
|
44
|
+
constructor(api) {
|
|
45
|
+
this.api = api;
|
|
46
|
+
this.settings = null;
|
|
47
|
+
this.failures = [];
|
|
48
|
+
this.qualityRoles = '';
|
|
49
|
+
this.securityRoles = '';
|
|
50
|
+
this.error = '';
|
|
51
|
+
this.success = '';
|
|
52
|
+
this.busy = false;
|
|
53
|
+
}
|
|
54
|
+
ngOnInit() { this.api.notificationFailures().subscribe({ next: x => this.failures = x }); this.api.notificationSettings().subscribe({ next: x => { this.settings = x; this.qualityRoles = x.qualityRoles.join('\n'); this.securityRoles = x.securityRoles.join('\n'); }, error: e => this.error = errorMessage(e) }); }
|
|
55
|
+
save() { if (!this.settings)
|
|
56
|
+
return; this.busy = true; this.settings.qualityRoles = this.qualityRoles.split('\n').map(x => x.trim()).filter(Boolean); this.settings.securityRoles = this.securityRoles.split('\n').map(x => x.trim()).filter(Boolean); this.api.saveNotificationSettings(this.settings).subscribe({ next: () => { this.busy = false; this.success = 'Bildirim ayarları kaydedildi.'; }, error: e => { this.error = errorMessage(e); this.busy = false; } }); }
|
|
57
|
+
}
|
|
58
|
+
QualityNotificationSettingsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationSettingsComponent, deps: [{ token: i1.QualityApiService }], target: i0.ɵɵFactoryTarget.Component });
|
|
59
|
+
QualityNotificationSettingsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityNotificationSettingsComponent, selector: "lib-quality-notification-settings", ngImport: i0, template: `<div class="container-fluid"><h3>Kalite Bildirim Ayarları</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div *ngIf="success" class="alert alert-success">{{success}}</div><div class="card" *ngIf="settings as s"><div class="card-body"><label class="d-block"><input type="checkbox" [(ngModel)]="s.portalEnabled" /> Portal içi bildirim</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.emailEnabled" /> E-posta bildirimi</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.reminderEnabled" /> Bekleyen kontrol hatırlatması</label><label class="mt-3">Portal Adresi (e-posta bağlantıları için)</label><input class="form-control" [(ngModel)]="s.portalBaseUrl" placeholder="https://portal.example.com" /><div class="row mt-3"><div class="col-md-4"><label>Hatırlatma Süresi (dakika)</label><input type="number" min="1" max="10080" class="form-control" [(ngModel)]="s.reminderMinutes" /></div><div class="col-md-4"><label>Kalite Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="qualityRoles"></textarea></div><div class="col-md-4"><label>Ret Bildirimi Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="securityRoles"></textarea></div></div><button class="btn btn-primary mt-3" (click)="save()" [disabled]="busy">Kaydet</button><h5 class="mt-4" *ngIf="failures.length">Gönderim Sorunları</h5><div class="alert alert-warning" *ngFor="let failure of failures">{{failure.title || failure.eventType}} · {{failure.error}}</div></div></div></div>`, isInline: true, 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: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationSettingsComponent, decorators: [{
|
|
61
|
+
type: Component,
|
|
62
|
+
args: [{ selector: 'lib-quality-notification-settings', template: `<div class="container-fluid"><h3>Kalite Bildirim Ayarları</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div *ngIf="success" class="alert alert-success">{{success}}</div><div class="card" *ngIf="settings as s"><div class="card-body"><label class="d-block"><input type="checkbox" [(ngModel)]="s.portalEnabled" /> Portal içi bildirim</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.emailEnabled" /> E-posta bildirimi</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.reminderEnabled" /> Bekleyen kontrol hatırlatması</label><label class="mt-3">Portal Adresi (e-posta bağlantıları için)</label><input class="form-control" [(ngModel)]="s.portalBaseUrl" placeholder="https://portal.example.com" /><div class="row mt-3"><div class="col-md-4"><label>Hatırlatma Süresi (dakika)</label><input type="number" min="1" max="10080" class="form-control" [(ngModel)]="s.reminderMinutes" /></div><div class="col-md-4"><label>Kalite Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="qualityRoles"></textarea></div><div class="col-md-4"><label>Ret Bildirimi Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="securityRoles"></textarea></div></div><button class="btn btn-primary mt-3" (click)="save()" [disabled]="busy">Kaydet</button><h5 class="mt-4" *ngIf="failures.length">Gönderim Sorunları</h5><div class="alert alert-warning" *ngFor="let failure of failures">{{failure.title || failure.eventType}} · {{failure.error}}</div></div></div></div>` }]
|
|
63
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }]; } });
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eS1ub3RpZmljYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMvcXVhbGl0eS1ub3RpZmljYXRpb25zLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUc3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHaEUsT0FBTyxFQUFnQixLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFHdkQsTUFBTSxPQUFPLDZCQUE2QjtJQUV4QyxZQUFvQixHQUFzQixFQUFVLE1BQWM7UUFBOUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRGxFLFVBQUssR0FBMEIsRUFBRSxDQUFDO1FBQUMsVUFBSyxHQUFHLEVBQUUsQ0FBQztJQUN1QixDQUFDO0lBQ3RFLFFBQVEsS0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakksSUFBSSxDQUFDLENBQXNCLElBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFD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QUFwQyxvQ0FBb0MseUVBRHFCLHFpREFBcWlEOzJGQUM5bEQsb0NBQW9DO2tCQURoRCxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLG1DQUFtQyxFQUFFLFFBQVEsRUFBRSxxaURBQXFpRCxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBRdWFsaXR5QXBpU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBRdWFsaXR5Tm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25TZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcclxuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVhbGl0eS1tZWFzdXJlbWVudHMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb25maWdTdGF0ZVNlcnZpY2UsIFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aW1lciwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7IHNlbGVjdG9yOiAnbGliLXF1YWxpdHktbm90aWZpY2F0aW9ucycsIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPjxoMz5LYWxpdGUgQmlsZGlyaW1sZXJpPC9oMz48ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPnt7ZXJyb3J9fTwvZGl2PjxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIiAqbmdGb3I9XCJsZXQgbiBvZiBpdGVtc1wiPjxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj48c3Ryb25nPnt7bi50aXRsZX19PC9zdHJvbmc+IDxzcGFuICpuZ0lmPVwiIW4uaXNSZWFkXCIgY2xhc3M9XCJiYWRnZSBiYWRnZS1wcmltYXJ5XCI+WWVuaTwvc3Bhbj48c21hbGwgY2xhc3M9XCJmbG9hdC1yaWdodFwiPnt7bi5jcmVhdGVkQXQgfCBkYXRlOidkZC5NTS55eXl5IEhIOm1tJ319PC9zbWFsbD48ZGl2IGNsYXNzPVwibXQtMlwiIFtpbm5lckhUTUxdPVwibi5ib2R5XCI+PC9kaXY+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG10LTJcIiAoY2xpY2spPVwib3BlbihuKVwiPktheWTEsSBBw6c8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBtdC0yIG1sLTJcIiAqbmdJZj1cIiFuLmlzUmVhZFwiIChjbGljayk9XCJyZWFkKG4pXCI+T2t1bmR1IMSwxZ9hcmV0bGU8L2J1dHRvbj48L2Rpdj48L2Rpdj48cCAqbmdJZj1cIiFpdGVtcy5sZW5ndGhcIj5CaWxkaXJpbSBidWx1bm11eW9yLjwvcD48L2Rpdj5gIH0pXHJcbmV4cG9ydCBjbGFzcyBRdWFsaXR5Tm90aWZpY2F0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgaXRlbXM6IFF1YWxpdHlOb3RpZmljYXRpb25bXSA9IFtdOyBlcnJvciA9ICcnO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBpOiBRdWFsaXR5QXBpU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge31cclxuICBuZ09uSW5pdCgpOiB2b2lkIHsgdGhpcy5hcGkubm90aWZpY2F0aW9ucygpLnN1YnNjcmliZSh7IG5leHQ6IHggPT4gdGhpcy5pdGVtcyA9IHgsIGVycm9yOiBlID0+IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSkgfSk7IH1cclxuICByZWFkKG46IFF1YWxpdHlOb3RpZmljYXRpb24pOiB2b2lkIHsgdGhpcy5hcGkucmVhZE5vdGlmaWNhdGlvbihuLmNvZGUpLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IG4uaXNSZWFkID0gdHJ1ZSwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSB9KTsgfVxyXG4gIG9wZW4objogUXVhbGl0eU5vdGlmaWNhdGlvbik6IHZvaWQgeyB0aGlzLnJlYWQobik7IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobi51cmwpOyB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2xpYi1xdWFsaXR5LW5vdGlmaWNhdGlvbi1iZWxsJywgdGVtcGxhdGU6IGA8YSBjbGFzcz1cIm5hdi1saW5rIHBvc2l0aW9uLXJlbGF0aXZlXCIgcm91dGVyTGluaz1cIi9rYWxpdGUvbm90aWZpY2F0aW9uc1wiIGFyaWEtbGFiZWw9XCJLYWxpdGUgYmlsZGlyaW1sZXJpXCI+PGkgY2xhc3M9XCJmYXMgZmEtYmVsbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWRhbmdlclwiICpuZ0lmPVwiY291bnRcIj57e2NvdW50fX08L3NwYW4+PC9hPmAgfSlcclxuZXhwb3J0IGNsYXNzIFF1YWxpdHlOb3RpZmljYXRpb25CZWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNvdW50ID0gMDsgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcGk6IFF1YWxpdHlBcGlTZXJ2aWNlLCBwcml2YXRlIGNvbmZpZzogQ29uZmlnU3RhdGVTZXJ2aWNlKSB7fVxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnLmdldE9uZSQoJ2N1cnJlbnRVc2VyJykucGlwZShzd2l0Y2hNYXAodXNlciA9PiB1c2VyPy5pc0F1dGhlbnRpY2F0ZWQgPyB0aW1lcigwLCA2MDAwMCkucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy5hcGkudW5yZWFkTm90aWZpY2F0aW9ucygpLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZigwKSkpKSkgOiBvZigwKSkpLnN1YnNjcmliZShjb3VudCA9PiB0aGlzLmNvdW50ID0gY291bnQpOyB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7IHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpOyB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2xpYi1xdWFsaXR5LW5vdGlmaWNhdGlvbi1zZXR0aW5ncycsIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPjxoMz5LYWxpdGUgQmlsZGlyaW0gQXlhcmxhcsSxPC9oMz48ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPnt7ZXJyb3J9fTwvZGl2PjxkaXYgKm5nSWY9XCJzdWNjZXNzXCIgY2xhc3M9XCJhbGVydCBhbGVydC1zdWNjZXNzXCI+e3tzdWNjZXNzfX08L2Rpdj48ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwic2V0dGluZ3MgYXMgc1wiPjxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj48bGFiZWwgY2xhc3M9XCJkLWJsb2NrXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicy5wb3J0YWxFbmFibGVkXCIgLz4gUG9ydGFsIGnDp2kgYmlsZGlyaW08L2xhYmVsPjxsYWJlbCBjbGFzcz1cImQtYmxvY2tcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJzLmVtYWlsRW5hYmxlZFwiIC8+IEUtcG9zdGEgYmlsZGlyaW1pPC9sYWJlbD48bGFiZWwgY2xhc3M9XCJkLWJsb2NrXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicy5yZW1pbmRlckVuYWJsZWRcIiAvPiBCZWtsZXllbiBrb250cm9sIGhhdMSxcmxhdG1hc8SxPC9sYWJlbD48bGFiZWwgY2xhc3M9XCJtdC0zXCI+UG9ydGFsIEFkcmVzaSAoZS1wb3N0YSBiYcSfbGFudMSxbGFyxLEgacOnaW4pPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInMucG9ydGFsQmFzZVVybFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9wb3J0YWwuZXhhbXBsZS5jb21cIiAvPjxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPjxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5IYXTEsXJsYXRtYSBTw7xyZXNpIChkYWtpa2EpPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDA4MFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzLnJlbWluZGVyTWludXRlc1wiIC8+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkthbGl0ZSBBbMSxY8SxIFJvbGxlcmkgKGhlciBzYXTEsXIgYmlyIHJvbCk8L2xhYmVsPjx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCI0XCIgWyhuZ01vZGVsKV09XCJxdWFsaXR5Um9sZXNcIj48L3RleHRhcmVhPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5SZXQgQmlsZGlyaW1pIEFsxLFjxLEgUm9sbGVyaSAoaGVyIHNhdMSxciBiaXIgcm9sKTwvbGFiZWw+PHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjRcIiBbKG5nTW9kZWwpXT1cInNlY3VyaXR5Um9sZXNcIj48L3RleHRhcmVhPjwvZGl2PjwvZGl2PjxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtM1wiIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPktheWRldDwvYnV0dG9uPjxoNSBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImZhaWx1cmVzLmxlbmd0aFwiPkfDtm5kZXJpbSBTb3J1bmxhcsSxPC9oNT48ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiICpuZ0Zvcj1cImxldCBmYWlsdXJlIG9mIGZhaWx1cmVzXCI+e3tmYWlsdXJlLnRpdGxlIHx8IGZhaWx1cmUuZXZlbnRUeXBlfX0gwrcge3tmYWlsdXJlLmVycm9yfX08L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj5gIH0pXHJcbmV4cG9ydCBjbGFzcyBRdWFsaXR5Tm90aWZpY2F0aW9uU2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHNldHRpbmdzOiBOb3RpZmljYXRpb25TZXR0aW5ncyB8IG51bGwgPSBudWxsOyBmYWlsdXJlczogYW55W10gPSBbXTsgcXVhbGl0eVJvbGVzID0gJyc7IHNlY3VyaXR5Um9sZXMgPSAnJzsgZXJyb3IgPSAnJzsgc3VjY2VzcyA9ICcnOyBidXN5ID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcGk6IFF1YWxpdHlBcGlTZXJ2aWNlKSB7fVxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB0aGlzLmFwaS5ub3RpZmljYXRpb25GYWlsdXJlcygpLnN1YnNjcmliZSh7bmV4dDogeCA9PiB0aGlzLmZhaWx1cmVzID0geH0pOyB0aGlzLmFwaS5ub3RpZmljYXRpb25TZXR0aW5ncygpLnN1YnNjcmliZSh7IG5leHQ6IHggPT4geyB0aGlzLnNldHRpbmdzID0geDsgdGhpcy5xdWFsaXR5Um9sZXMgPSB4LnF1YWxpdHlSb2xlcy5qb2luKCdcXG4nKTsgdGhpcy5zZWN1cml0eVJvbGVzID0geC5zZWN1cml0eVJvbGVzLmpvaW4oJ1xcbicpOyB9LCBlcnJvcjogZSA9PiB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpIH0pOyB9XHJcbiAgc2F2ZSgpOiB2b2lkIHsgaWYgKCF0aGlzLnNldHRpbmdzKSByZXR1cm47IHRoaXMuYnVzeSA9IHRydWU7IHRoaXMuc2V0dGluZ3MucXVhbGl0eVJvbGVzID0gdGhpcy5xdWFsaXR5Um9sZXMuc3BsaXQoJ1xcbicpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7IHRoaXMuc2V0dGluZ3Muc2VjdXJpdHlSb2xlcyA9IHRoaXMuc2VjdXJpdHlSb2xlcy5zcGxpdCgnXFxuJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcihCb29sZWFuKTsgdGhpcy5hcGkuc2F2ZU5vdGlmaWNhdGlvblNldHRpbmdzKHRoaXMuc2V0dGluZ3MpLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHsgdGhpcy5idXN5ID0gZmFsc2U7IHRoaXMuc3VjY2VzcyA9ICdCaWxkaXJpbSBheWFybGFyxLEga2F5ZGVkaWxkaS4nOyB9LCBlcnJvcjogZSA9PiB7IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7IHRoaXMuYnVzeSA9IGZhbHNlOyB9IH0pOyB9XHJcbn1cclxuIl19
|