@hitsoft/smart-warehouse 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.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/config/enums/index.d.ts +1 -0
  3. package/config/enums/route-names.d.ts +12 -0
  4. package/config/index.d.ts +5 -0
  5. package/config/providers/connector-params-route.provider.d.ts +8 -0
  6. package/config/providers/index.d.ts +7 -0
  7. package/config/providers/order-station-route.provider.d.ts +8 -0
  8. package/config/providers/orders-route.provider.d.ts +8 -0
  9. package/config/providers/quantity-correction-route.provider.d.ts +8 -0
  10. package/config/providers/route.provider.d.ts +8 -0
  11. package/config/providers/shelf-placement-route.provider.d.ts +8 -0
  12. package/config/providers/shelf-transfer-route.provider.d.ts +8 -0
  13. package/config/providers/shortages-route.provider.d.ts +8 -0
  14. package/config/providers/station.provider.d.ts +8 -0
  15. package/config/providers/stock-report.d.ts +8 -0
  16. package/config/public-api.d.ts +3 -0
  17. package/config/smart-warehouse-config.module.d.ts +8 -0
  18. package/esm2020/config/enums/index.mjs +2 -0
  19. package/esm2020/config/enums/route-names.mjs +2 -0
  20. package/esm2020/config/hitsoft-smart-warehouse-config.mjs +5 -0
  21. package/esm2020/config/providers/connector-params-route.provider.mjs +25 -0
  22. package/esm2020/config/providers/index.mjs +8 -0
  23. package/esm2020/config/providers/order-station-route.provider.mjs +25 -0
  24. package/esm2020/config/providers/orders-route.provider.mjs +25 -0
  25. package/esm2020/config/providers/quantity-correction-route.provider.mjs +25 -0
  26. package/esm2020/config/providers/route.provider.mjs +24 -0
  27. package/esm2020/config/providers/shelf-placement-route.provider.mjs +25 -0
  28. package/esm2020/config/providers/shelf-transfer-route.provider.mjs +25 -0
  29. package/esm2020/config/providers/shortages-route.provider.mjs +25 -0
  30. package/esm2020/config/providers/station.provider.mjs +25 -0
  31. package/esm2020/config/providers/stock-report.mjs +25 -0
  32. package/esm2020/config/public-api.mjs +4 -0
  33. package/esm2020/config/smart-warehouse-config.module.mjs +37 -0
  34. package/esm2020/hitsoft-smart-warehouse.mjs +5 -0
  35. package/esm2020/lib/components/connector-params/connector-params.component.mjs +182 -0
  36. package/esm2020/lib/components/connector-params/connector-params.module.mjs +41 -0
  37. package/esm2020/lib/components/order-station/order-station.component.mjs +160 -0
  38. package/esm2020/lib/components/order-station/order-station.module.mjs +57 -0
  39. package/esm2020/lib/components/orders/orders.component.mjs +445 -0
  40. package/esm2020/lib/components/orders/orders.module.mjs +75 -0
  41. package/esm2020/lib/components/quantity-correction/quantity-correction.component.mjs +231 -0
  42. package/esm2020/lib/components/quantity-correction/quantity-correction.module.mjs +41 -0
  43. package/esm2020/lib/components/shelf-placement/shelf-placement.component.mjs +297 -0
  44. package/esm2020/lib/components/shelf-placement/shelf-placement.module.mjs +66 -0
  45. package/esm2020/lib/components/shelf-transfer/shelf-transfer.component.mjs +146 -0
  46. package/esm2020/lib/components/shelf-transfer/shelf-transfer.module.mjs +41 -0
  47. package/esm2020/lib/components/shortages/shortages.component.mjs +75 -0
  48. package/esm2020/lib/components/shortages/shortages.module.mjs +42 -0
  49. package/esm2020/lib/components/smart-warehouse.component.mjs +18 -0
  50. package/esm2020/lib/components/stock-report/stock-report.component.mjs +29 -0
  51. package/esm2020/lib/components/stock-report/stock-report.module.mjs +42 -0
  52. package/esm2020/lib/guards/connector-params.guard.mjs +58 -0
  53. package/esm2020/lib/hit-proxy/connector-params/connector-params.service.mjs +27 -0
  54. package/esm2020/lib/hit-proxy/devexpress-query-builder/devexpress-load-options.model.mjs +2 -0
  55. package/esm2020/lib/hit-proxy/devexpress-query-builder/devexpress-query-builder.mjs +62 -0
  56. package/esm2020/lib/hit-proxy/inventory/inventory.service.mjs +21 -0
  57. package/esm2020/lib/hit-proxy/order-station/order-station.service.mjs +18 -0
  58. package/esm2020/lib/hit-proxy/orders/model.mjs +2 -0
  59. package/esm2020/lib/hit-proxy/orders/order.service.mjs +81 -0
  60. package/esm2020/lib/hit-proxy/quantity-correction/quantity-correction.service.mjs +47 -0
  61. package/esm2020/lib/hit-proxy/shortages/model.mjs +2 -0
  62. package/esm2020/lib/hit-proxy/shortages/shortages.service.mjs +26 -0
  63. package/esm2020/lib/hit-proxy/stations/station.service.mjs +86 -0
  64. package/esm2020/lib/hit-proxy/stock-report/stock-report.service.mjs +22 -0
  65. package/esm2020/lib/hit-proxy/stock-transfer/stock-transfer.service.mjs +21 -0
  66. package/esm2020/lib/hit-proxy/warehouse/warehouse.service.mjs +65 -0
  67. package/esm2020/lib/services/smart-warehouse.service.mjs +21 -0
  68. package/esm2020/lib/smart-warehouse-routing.module.mjs +79 -0
  69. package/esm2020/lib/smart-warehouse.module.mjs +34 -0
  70. package/esm2020/lib/stations/station.component.mjs +43 -0
  71. package/esm2020/lib/stations/station.module.mjs +42 -0
  72. package/esm2020/public-api.mjs +20 -0
  73. package/fesm2015/hitsoft-smart-warehouse-config.mjs +264 -0
  74. package/fesm2015/hitsoft-smart-warehouse-config.mjs.map +1 -0
  75. package/fesm2015/hitsoft-smart-warehouse.mjs +2577 -0
  76. package/fesm2015/hitsoft-smart-warehouse.mjs.map +1 -0
  77. package/fesm2020/hitsoft-smart-warehouse-config.mjs +264 -0
  78. package/fesm2020/hitsoft-smart-warehouse-config.mjs.map +1 -0
  79. package/fesm2020/hitsoft-smart-warehouse.mjs +2515 -0
  80. package/fesm2020/hitsoft-smart-warehouse.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/components/connector-params/connector-params.component.d.ts +44 -0
  83. package/lib/components/connector-params/connector-params.module.d.ts +13 -0
  84. package/lib/components/order-station/order-station.component.d.ts +31 -0
  85. package/lib/components/order-station/order-station.module.d.ts +16 -0
  86. package/lib/components/orders/orders.component.d.ts +63 -0
  87. package/lib/components/orders/orders.module.d.ts +17 -0
  88. package/lib/components/quantity-correction/quantity-correction.component.d.ts +52 -0
  89. package/lib/components/quantity-correction/quantity-correction.module.d.ts +16 -0
  90. package/lib/components/shelf-placement/shelf-placement.component.d.ts +93 -0
  91. package/lib/components/shelf-placement/shelf-placement.module.d.ts +17 -0
  92. package/lib/components/shelf-transfer/shelf-transfer.component.d.ts +26 -0
  93. package/lib/components/shelf-transfer/shelf-transfer.module.d.ts +16 -0
  94. package/lib/components/shortages/shortages.component.d.ts +25 -0
  95. package/lib/components/shortages/shortages.module.d.ts +17 -0
  96. package/lib/components/smart-warehouse.component.d.ts +10 -0
  97. package/lib/components/stock-report/stock-report.component.d.ts +16 -0
  98. package/lib/components/stock-report/stock-report.module.d.ts +17 -0
  99. package/lib/guards/connector-params.guard.d.ts +21 -0
  100. package/lib/hit-proxy/connector-params/connector-params.service.d.ts +46 -0
  101. package/lib/hit-proxy/devexpress-query-builder/devexpress-load-options.model.d.ts +8 -0
  102. package/lib/hit-proxy/devexpress-query-builder/devexpress-query-builder.d.ts +17 -0
  103. package/lib/hit-proxy/inventory/inventory.service.d.ts +22 -0
  104. package/lib/hit-proxy/order-station/order-station.service.d.ts +24 -0
  105. package/lib/hit-proxy/orders/model.d.ts +74 -0
  106. package/lib/hit-proxy/orders/order.service.d.ts +26 -0
  107. package/lib/hit-proxy/quantity-correction/quantity-correction.service.d.ts +88 -0
  108. package/lib/hit-proxy/shortages/model.d.ts +17 -0
  109. package/lib/hit-proxy/shortages/shortages.service.d.ts +13 -0
  110. package/lib/hit-proxy/stations/station.service.d.ts +25 -0
  111. package/lib/hit-proxy/stock-report/stock-report.service.d.ts +12 -0
  112. package/lib/hit-proxy/stock-transfer/stock-transfer.service.d.ts +19 -0
  113. package/lib/hit-proxy/warehouse/warehouse.service.d.ts +59 -0
  114. package/lib/services/smart-warehouse.service.d.ts +10 -0
  115. package/lib/smart-warehouse-routing.module.d.ts +7 -0
  116. package/lib/smart-warehouse.module.d.ts +13 -0
  117. package/lib/stations/station.component.d.ts +14 -0
  118. package/lib/stations/station.module.d.ts +17 -0
  119. package/package.json +45 -0
  120. package/public-api.d.ts +16 -0
@@ -0,0 +1,182 @@
1
+ import { Component, ViewEncapsulation } from '@angular/core';
2
+ import { forkJoin, of } from 'rxjs';
3
+ import { catchError } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../hit-proxy/connector-params/connector-params.service";
6
+ import * as i2 from "@abp/ng.theme.shared";
7
+ import * as i3 from "../../guards/connector-params.guard";
8
+ import * as i4 from "@angular/router";
9
+ import * as i5 from "../../hit-proxy/warehouse/warehouse.service";
10
+ import * as i6 from "@angular/common";
11
+ import * as i7 from "@angular/forms";
12
+ import * as i8 from "@abp/ng.components/page";
13
+ export class ConnectorParamsComponent {
14
+ constructor(connectorParamsService, toasterService, guard, router, route, warehouseService) {
15
+ this.connectorParamsService = connectorParamsService;
16
+ this.toasterService = toasterService;
17
+ this.guard = guard;
18
+ this.router = router;
19
+ this.route = route;
20
+ this.warehouseService = warehouseService;
21
+ this.erpOptions = [
22
+ { value: 'MIKRO', label: 'Mikro ERP' },
23
+ ];
24
+ this.warehouses = [];
25
+ this.binLocations = [];
26
+ this.isLoadingBinLocations = false;
27
+ this.form = {
28
+ erpType: 'MIKRO',
29
+ baseUrl: '',
30
+ apiKey: '',
31
+ username: '',
32
+ password: '',
33
+ isActive: true,
34
+ fromWarehouseCode: '',
35
+ targetWarehouseCode: '',
36
+ dummyBoxCode: '',
37
+ beeCellUsername: '',
38
+ beeCellPassword: '',
39
+ };
40
+ this.passwordSet = false;
41
+ this.beeCellPasswordSet = false;
42
+ this.isLoading = false;
43
+ this.isSaving = false;
44
+ }
45
+ ngOnInit() {
46
+ const reason = this.route.snapshot.queryParamMap.get('reason');
47
+ if (reason === 'no-config') {
48
+ this.toasterService.warn('Connector parametreleri yapılandırılmamış.');
49
+ }
50
+ this.loadData();
51
+ }
52
+ // İki API'yi birlikte bekle: depo listesi hazır olmadan form render edilmez,
53
+ // böylece ngModel option geçişi (race condition) yaşanmaz.
54
+ loadData() {
55
+ this.isLoading = true;
56
+ forkJoin({
57
+ params: this.connectorParamsService.getConnectorParams(),
58
+ warehouses: this.warehouseService.getSmartWarehouses().pipe(catchError(() => of([]))),
59
+ }).subscribe({
60
+ next: ({ params, warehouses }) => {
61
+ this.warehouses = warehouses;
62
+ if (params) {
63
+ this.form.erpType = params.erpType ?? 'MIKRO';
64
+ this.form.baseUrl = params.baseUrl ?? '';
65
+ this.form.apiKey = params.apiKey ?? '';
66
+ this.form.username = params.username ?? '';
67
+ this.form.isActive = params.isActive;
68
+ this.form.password = '';
69
+ this.form.fromWarehouseCode = params.fromWarehouseCode ?? '';
70
+ this.form.targetWarehouseCode = params.targetWarehouseCode ?? '';
71
+ this.form.dummyBoxCode = params.dummyBoxCode ?? '';
72
+ this.form.beeCellUsername = params.beeCellUsername ?? '';
73
+ this.form.beeCellPassword = '';
74
+ this.passwordSet = params.passwordSet;
75
+ this.beeCellPasswordSet = params.beeCellPasswordSet ?? false;
76
+ }
77
+ this.isLoading = false;
78
+ // Kayıtlı kaynak depo varsa, Dummy Kasa combobox'ının o depoya ait depo yerleriyle dolması için yükle.
79
+ if (this.form.fromWarehouseCode) {
80
+ this.loadBinLocations(this.form.fromWarehouseCode);
81
+ }
82
+ },
83
+ error: err => {
84
+ this.toasterService.error(err?.error?.error?.message ?? 'Parametreler yüklenirken bir hata oluştu.');
85
+ this.isLoading = false;
86
+ },
87
+ });
88
+ }
89
+ get isCurrentFromWhsInList() {
90
+ return this.warehouses.some(w => w.WhsCode === this.form.fromWarehouseCode);
91
+ }
92
+ get isCurrentWhsInList() {
93
+ return this.warehouses.some(w => w.WhsCode === this.form.targetWarehouseCode);
94
+ }
95
+ get isCurrentDummyBoxInList() {
96
+ return this.binLocations.some(b => b.BinCode === this.form.dummyBoxCode);
97
+ }
98
+ /**
99
+ * Kaynak Depo seçimi değiştiğinde çalışır: Dummy Kasa combobox'ını seçilen deponun
100
+ * depo yerleriyle doldurur. Depo değiştiği için önceki depoya ait seçim artık geçerli değil.
101
+ */
102
+ onFromWarehouseChange(whsCode) {
103
+ this.form.fromWarehouseCode = whsCode;
104
+ this.form.dummyBoxCode = '';
105
+ this.loadBinLocations(whsCode);
106
+ }
107
+ loadBinLocations(whsCode) {
108
+ if (!whsCode) {
109
+ this.binLocations = [];
110
+ return;
111
+ }
112
+ this.isLoadingBinLocations = true;
113
+ this.warehouseService.getBinLocationsByWarehouse(whsCode).subscribe({
114
+ next: (bins) => {
115
+ this.binLocations = bins || [];
116
+ this.isLoadingBinLocations = false;
117
+ },
118
+ error: () => {
119
+ this.binLocations = [];
120
+ this.isLoadingBinLocations = false;
121
+ },
122
+ });
123
+ }
124
+ save() {
125
+ if (!this.form.erpType) {
126
+ this.toasterService.warn('ERP Sağlayıcısı zorunludur.');
127
+ return;
128
+ }
129
+ if (!this.form.baseUrl?.trim()) {
130
+ this.toasterService.warn('Base URL zorunludur.');
131
+ return;
132
+ }
133
+ if (!this.form.apiKey?.trim()) {
134
+ this.toasterService.warn('API Key zorunludur.');
135
+ return;
136
+ }
137
+ if (!this.form.username?.trim()) {
138
+ this.toasterService.warn('Kullanıcı Adı zorunludur.');
139
+ return;
140
+ }
141
+ if (!this.passwordSet && !this.form.password?.trim()) {
142
+ this.toasterService.warn('Şifre zorunludur.');
143
+ return;
144
+ }
145
+ if (!this.form.beeCellUsername?.trim()) {
146
+ this.toasterService.warn('BeeCell Kullanıcı Adı zorunludur.');
147
+ return;
148
+ }
149
+ if (!this.beeCellPasswordSet && !this.form.beeCellPassword?.trim()) {
150
+ this.toasterService.warn('BeeCell Şifresi zorunludur.');
151
+ return;
152
+ }
153
+ this.isSaving = true;
154
+ this.connectorParamsService.saveConnectorParams(this.form).subscribe({
155
+ next: () => {
156
+ this.toasterService.success('Parametreler başarıyla kaydedildi.');
157
+ if (this.form.password) {
158
+ this.passwordSet = true;
159
+ this.form.password = '';
160
+ }
161
+ if (this.form.beeCellPassword) {
162
+ this.beeCellPasswordSet = true;
163
+ this.form.beeCellPassword = '';
164
+ }
165
+ // Guard cache'ini güncelle — diğer ekranlar artık erişilebilir
166
+ this.guard.invalidate();
167
+ this.isSaving = false;
168
+ },
169
+ error: err => {
170
+ this.toasterService.error(err?.error?.error?.message ?? 'Kayıt sırasında bir hata oluştu.');
171
+ this.isSaving = false;
172
+ },
173
+ });
174
+ }
175
+ }
176
+ ConnectorParamsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsComponent, deps: [{ token: i1.ConnectorParamsService }, { token: i2.ToasterService }, { token: i3.ConnectorParamsGuard }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i5.WarehouseService }], target: i0.ɵɵFactoryTarget.Component });
177
+ ConnectorParamsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ConnectorParamsComponent, selector: "lib-connector-params", ngImport: i0, template: "<abp-page [title]=\"'Connector Parametreleri'\">\r\n <div class=\"connector-params-container\">\r\n\r\n <!-- Y\u00FCkleniyor -->\r\n <div class=\"text-center py-4\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-border text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Y\u00FCkleniyor...</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Form -->\r\n <div class=\"card connector-params-card\" [hidden]=\"isLoading\">\r\n <div class=\"card-body\">\r\n\r\n <!-- ERP Sa\u011Flay\u0131c\u0131s\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"erpTypeSelect\">ERP Sa\u011Flay\u0131c\u0131s\u0131 <span class=\"text-danger\">*</span></label>\r\n <select id=\"erpTypeSelect\" class=\"form-select\" [(ngModel)]=\"form.erpType\" required>\r\n <option *ngFor=\"let opt of erpOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Base URL -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"baseUrlInput\">Base URL <span class=\"text-danger\">*</span></label>\r\n <input id=\"baseUrlInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.baseUrl\"\r\n placeholder=\"https://erp-server:38080\" required />\r\n </div>\r\n\r\n <!-- API Key -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"apiKeyInput\">API Key <span class=\"text-danger\">*</span></label>\r\n <input id=\"apiKeyInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.apiKey\"\r\n placeholder=\"API anahtar\u0131\" required />\r\n </div>\r\n\r\n <!-- Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"usernameInput\">Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"usernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.username\"\r\n placeholder=\"Kullan\u0131c\u0131 ad\u0131\" required />\r\n </div>\r\n\r\n <!-- \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"passwordInput\">\r\n \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"passwordSet && !form.password\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"passwordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.password\"\r\n [placeholder]=\"passwordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : '\u015Eifre'\" />\r\n <small class=\"text-muted\" *ngIf=\"passwordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- BeeCell Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellUsernameInput\">BeeCell Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"beeCellUsernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellUsername\"\r\n placeholder=\"BeeCell kullan\u0131c\u0131 ad\u0131\" required />\r\n <small class=\"text-muted\">BeeCell/Orchestrator API giri\u015Fi i\u00E7in kullan\u0131l\u0131r (ERP kullan\u0131c\u0131s\u0131ndan ayr\u0131d\u0131r).</small>\r\n </div>\r\n\r\n <!-- BeeCell \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellPasswordInput\">\r\n BeeCell \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"beeCellPasswordSet && !form.beeCellPassword\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"beeCellPasswordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellPassword\"\r\n [placeholder]=\"beeCellPasswordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : 'BeeCell \u015Fifresi'\" />\r\n <small class=\"text-muted\" *ngIf=\"beeCellPasswordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- Kaynak Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"fromWhsSelect\">\r\n Kaynak Depo (Stok Transfer)\r\n </label>\r\n <select id=\"fromWhsSelect\" class=\"form-select\"\r\n [ngModel]=\"form.fromWarehouseCode\"\r\n (ngModelChange)=\"onFromWarehouseChange($event)\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.fromWarehouseCode && !isCurrentFromWhsInList\"\r\n [value]=\"form.fromWarehouseCode\">\r\n {{ form.fromWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin kaynak deposu.</small>\r\n </div>\r\n\r\n <!-- Hedef Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"targetWhsSelect\">\r\n Hedef Depo (Stok Transfer) <span class=\"text-danger\">*</span>\r\n </label>\r\n <select id=\"targetWhsSelect\" class=\"form-select\" [(ngModel)]=\"form.targetWarehouseCode\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.targetWarehouseCode && !isCurrentWhsInList\"\r\n [value]=\"form.targetWarehouseCode\">\r\n {{ form.targetWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin hedef deposu.</small>\r\n </div>\r\n\r\n <!-- Dummy Kasa -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"dummyBoxSelect\">Dummy Kasa Kodu</label>\r\n <select id=\"dummyBoxSelect\" class=\"form-select\"\r\n [(ngModel)]=\"form.dummyBoxCode\"\r\n [disabled]=\"!form.fromWarehouseCode || isLoadingBinLocations\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.dummyBoxCode && !isCurrentDummyBoxInList\"\r\n [value]=\"form.dummyBoxCode\">\r\n {{ form.dummyBoxCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let bin of binLocations\" [value]=\"bin.BinCode\">\r\n {{ bin.BinCode }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\" *ngIf=\"!form.fromWarehouseCode\">\u00D6nce Kaynak Depo se\u00E7in.</small>\r\n <small class=\"text-muted\" *ngIf=\"isLoadingBinLocations\">Depo yerleri y\u00FCkleniyor...</small>\r\n <small class=\"text-muted\" *ngIf=\"form.fromWarehouseCode && !isLoadingBinLocations\">\r\n Kasa Miktar\u0131 G\u00FCncelleme'de fiili say\u0131m fark\u0131n\u0131n muhasebele\u015Ftirildi\u011Fi SAP bin kodu \u2014 se\u00E7ilen kaynak deponun depo yeri.\r\n </small>\r\n </div>\r\n\r\n <!-- Aktif -->\r\n <div class=\"mb-4 form-check\">\r\n <input id=\"isActiveCheck\" type=\"checkbox\" class=\"form-check-input\"\r\n [(ngModel)]=\"form.isActive\" />\r\n <label class=\"form-check-label\" for=\"isActiveCheck\">Aktif</label>\r\n </div>\r\n\r\n <!-- Kaydet Butonu -->\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-primary\" (click)=\"save()\" [disabled]=\"isSaving\">\r\n <span *ngIf=\"isSaving\" class=\"spinner-border spinner-border-sm me-1\" role=\"status\"></span>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</abp-page>\r\n", styles: [".connector-params-container{padding:1rem 0}.connector-params-container .connector-params-card{max-width:640px}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.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: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }], encapsulation: i0.ViewEncapsulation.None });
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsComponent, decorators: [{
179
+ type: Component,
180
+ args: [{ selector: 'lib-connector-params', encapsulation: ViewEncapsulation.None, template: "<abp-page [title]=\"'Connector Parametreleri'\">\r\n <div class=\"connector-params-container\">\r\n\r\n <!-- Y\u00FCkleniyor -->\r\n <div class=\"text-center py-4\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-border text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Y\u00FCkleniyor...</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Form -->\r\n <div class=\"card connector-params-card\" [hidden]=\"isLoading\">\r\n <div class=\"card-body\">\r\n\r\n <!-- ERP Sa\u011Flay\u0131c\u0131s\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"erpTypeSelect\">ERP Sa\u011Flay\u0131c\u0131s\u0131 <span class=\"text-danger\">*</span></label>\r\n <select id=\"erpTypeSelect\" class=\"form-select\" [(ngModel)]=\"form.erpType\" required>\r\n <option *ngFor=\"let opt of erpOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Base URL -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"baseUrlInput\">Base URL <span class=\"text-danger\">*</span></label>\r\n <input id=\"baseUrlInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.baseUrl\"\r\n placeholder=\"https://erp-server:38080\" required />\r\n </div>\r\n\r\n <!-- API Key -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"apiKeyInput\">API Key <span class=\"text-danger\">*</span></label>\r\n <input id=\"apiKeyInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.apiKey\"\r\n placeholder=\"API anahtar\u0131\" required />\r\n </div>\r\n\r\n <!-- Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"usernameInput\">Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"usernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.username\"\r\n placeholder=\"Kullan\u0131c\u0131 ad\u0131\" required />\r\n </div>\r\n\r\n <!-- \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"passwordInput\">\r\n \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"passwordSet && !form.password\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"passwordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.password\"\r\n [placeholder]=\"passwordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : '\u015Eifre'\" />\r\n <small class=\"text-muted\" *ngIf=\"passwordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- BeeCell Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellUsernameInput\">BeeCell Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"beeCellUsernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellUsername\"\r\n placeholder=\"BeeCell kullan\u0131c\u0131 ad\u0131\" required />\r\n <small class=\"text-muted\">BeeCell/Orchestrator API giri\u015Fi i\u00E7in kullan\u0131l\u0131r (ERP kullan\u0131c\u0131s\u0131ndan ayr\u0131d\u0131r).</small>\r\n </div>\r\n\r\n <!-- BeeCell \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellPasswordInput\">\r\n BeeCell \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"beeCellPasswordSet && !form.beeCellPassword\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"beeCellPasswordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellPassword\"\r\n [placeholder]=\"beeCellPasswordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : 'BeeCell \u015Fifresi'\" />\r\n <small class=\"text-muted\" *ngIf=\"beeCellPasswordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- Kaynak Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"fromWhsSelect\">\r\n Kaynak Depo (Stok Transfer)\r\n </label>\r\n <select id=\"fromWhsSelect\" class=\"form-select\"\r\n [ngModel]=\"form.fromWarehouseCode\"\r\n (ngModelChange)=\"onFromWarehouseChange($event)\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.fromWarehouseCode && !isCurrentFromWhsInList\"\r\n [value]=\"form.fromWarehouseCode\">\r\n {{ form.fromWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin kaynak deposu.</small>\r\n </div>\r\n\r\n <!-- Hedef Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"targetWhsSelect\">\r\n Hedef Depo (Stok Transfer) <span class=\"text-danger\">*</span>\r\n </label>\r\n <select id=\"targetWhsSelect\" class=\"form-select\" [(ngModel)]=\"form.targetWarehouseCode\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.targetWarehouseCode && !isCurrentWhsInList\"\r\n [value]=\"form.targetWarehouseCode\">\r\n {{ form.targetWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin hedef deposu.</small>\r\n </div>\r\n\r\n <!-- Dummy Kasa -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"dummyBoxSelect\">Dummy Kasa Kodu</label>\r\n <select id=\"dummyBoxSelect\" class=\"form-select\"\r\n [(ngModel)]=\"form.dummyBoxCode\"\r\n [disabled]=\"!form.fromWarehouseCode || isLoadingBinLocations\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.dummyBoxCode && !isCurrentDummyBoxInList\"\r\n [value]=\"form.dummyBoxCode\">\r\n {{ form.dummyBoxCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let bin of binLocations\" [value]=\"bin.BinCode\">\r\n {{ bin.BinCode }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\" *ngIf=\"!form.fromWarehouseCode\">\u00D6nce Kaynak Depo se\u00E7in.</small>\r\n <small class=\"text-muted\" *ngIf=\"isLoadingBinLocations\">Depo yerleri y\u00FCkleniyor...</small>\r\n <small class=\"text-muted\" *ngIf=\"form.fromWarehouseCode && !isLoadingBinLocations\">\r\n Kasa Miktar\u0131 G\u00FCncelleme'de fiili say\u0131m fark\u0131n\u0131n muhasebele\u015Ftirildi\u011Fi SAP bin kodu \u2014 se\u00E7ilen kaynak deponun depo yeri.\r\n </small>\r\n </div>\r\n\r\n <!-- Aktif -->\r\n <div class=\"mb-4 form-check\">\r\n <input id=\"isActiveCheck\" type=\"checkbox\" class=\"form-check-input\"\r\n [(ngModel)]=\"form.isActive\" />\r\n <label class=\"form-check-label\" for=\"isActiveCheck\">Aktif</label>\r\n </div>\r\n\r\n <!-- Kaydet Butonu -->\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-primary\" (click)=\"save()\" [disabled]=\"isSaving\">\r\n <span *ngIf=\"isSaving\" class=\"spinner-border spinner-border-sm me-1\" role=\"status\"></span>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</abp-page>\r\n", styles: [".connector-params-container{padding:1rem 0}.connector-params-container .connector-params-card{max-width:640px}\n"] }]
181
+ }], ctorParameters: function () { return [{ type: i1.ConnectorParamsService }, { type: i2.ToasterService }, { type: i3.ConnectorParamsGuard }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.WarehouseService }]; } });
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBVXJFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQWE1QyxNQUFNLE9BQU8sd0JBQXdCO0lBNEJuQyxZQUNVLHNCQUE4QyxFQUM5QyxjQUE4QixFQUM5QixLQUEyQixFQUMzQixNQUFjLEVBQ2QsS0FBcUIsRUFDckIsZ0JBQWtDO1FBTGxDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQXNCO1FBQzNCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBakM1QyxlQUFVLEdBQWdCO1lBQ3hCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1NBQ3ZDLENBQUM7UUFFRixlQUFVLEdBQW1CLEVBQUUsQ0FBQztRQUNoQyxpQkFBWSxHQUFxQixFQUFFLENBQUM7UUFDcEMsMEJBQXFC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QUM7b0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztpQkFDekI7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO2lCQUNoQztnQkFDRCwrREFBK0Q7Z0JBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLGtDQUFrQyxDQUFDLENBQUM7Z0JBQzVGLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztxSEFsTFUsd0JBQXdCO3lHQUF4Qix3QkFBd0IsNERDeEJyQyw2OVFBK0pBOzJGRHZJYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGlCQUdqQixpQkFBaUIsQ0FBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcclxuaW1wb3J0IHtcclxuICBDb25uZWN0b3JQYXJhbXNTZXJ2aWNlLFxyXG4gIENvbm5lY3RvclBhcmFtc0R0byxcclxuICBTYXZlQ29ubmVjdG9yUGFyYW1zRHRvLFxyXG59IGZyb20gJy4uLy4uL2hpdC1wcm94eS9jb25uZWN0b3ItcGFyYW1zL2Nvbm5lY3Rvci1wYXJhbXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbm5lY3RvclBhcmFtc0d1YXJkIH0gZnJvbSAnLi4vLi4vZ3VhcmRzL2Nvbm5lY3Rvci1wYXJhbXMuZ3VhcmQnO1xyXG5pbXBvcnQgeyBXYXJlaG91c2VTZXJ2aWNlLCBXYXJlaG91c2VEdG8sIEJpbkxvY2F0aW9uRHRvIH0gZnJvbSAnLi4vLi4vaGl0LXByb3h5L3dhcmVob3VzZS93YXJlaG91c2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW50ZXJmYWNlIEVycE9wdGlvbiB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jb25uZWN0b3ItcGFyYW1zJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25uZWN0b3JQYXJhbXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGVycE9wdGlvbnM6IEVycE9wdGlvbltdID0gW1xyXG4gICAgeyB2YWx1ZTogJ01JS1JPJywgbGFiZWw6ICdNaWtybyBFUlAnIH0sXHJcbiAgXTtcclxuXHJcbiAgd2FyZWhvdXNlczogV2FyZWhvdXNlRHRvW10gPSBbXTtcclxuICBiaW5Mb2NhdGlvbnM6IEJpbkxvY2F0aW9uRHRvW10gPSBbXTtcclxuICBpc0xvYWRpbmdCaW5Mb2NhdGlvbnMgPSBmYWxzZTtcclxuXHJcbiAgZm9ybTogU2F2ZUNvbm5lY3RvclBhcmFtc0R0byA9IHtcclxuICAgIGVycFR5cGU6ICdNSUtSTycsXHJcbiAgICBiYXNlVXJsOiAnJyxcclxuICAgIGFwaUtleTogJycsXHJcbiAgICB1c2VybmFtZTogJycsXHJcbiAgICBwYXNzd29yZDogJycsXHJcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgIGZyb21XYXJlaG91c2VDb2RlOiAnJyxcclxuICAgIHRhcmdldFdhcmVob3VzZUNvZGU6ICcnLFxyXG4gICAgZHVtbXlCb3hDb2RlOiAnJyxcclxuICAgIGJlZUNlbGxVc2VybmFtZTogJycsXHJcbiAgICBiZWVDZWxsUGFzc3dvcmQ6ICcnLFxyXG4gIH07XHJcblxyXG4gIHBhc3N3b3JkU2V0ID0gZmFsc2U7XHJcbiAgYmVlQ2VsbFBhc3N3b3JkU2V0ID0gZmFsc2U7XHJcbiAgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgaXNTYXZpbmcgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbm5lY3RvclBhcmFtc1NlcnZpY2U6IENvbm5lY3RvclBhcmFtc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3VhcmQ6IENvbm5lY3RvclBhcmFtc0d1YXJkLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSB3YXJlaG91c2VTZXJ2aWNlOiBXYXJlaG91c2VTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCByZWFzb24gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdyZWFzb24nKTtcclxuICAgIGlmIChyZWFzb24gPT09ICduby1jb25maWcnKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignQ29ubmVjdG9yIHBhcmFtZXRyZWxlcmkgeWFwxLFsYW5kxLFyxLFsbWFtxLHFny4nKTtcclxuICAgIH1cclxuICAgIHRoaXMubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIC8vIMSwa2kgQVBJJ3lpIGJpcmxpa3RlIGJla2xlOiBkZXBvIGxpc3Rlc2kgaGF6xLFyIG9sbWFkYW4gZm9ybSByZW5kZXIgZWRpbG1leixcclxuICAvLyBiw7Z5bGVjZSBuZ01vZGVsIG9wdGlvbiBnZcOnacWfaSAocmFjZSBjb25kaXRpb24pIHlhxZ9hbm1hei5cclxuICBsb2FkRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgcGFyYW1zOiB0aGlzLmNvbm5lY3RvclBhcmFtc1NlcnZpY2UuZ2V0Q29ubmVjdG9yUGFyYW1zKCksXHJcbiAgICAgIHdhcmVob3VzZXM6IHRoaXMud2FyZWhvdXNlU2VydmljZS5nZXRTbWFydFdhcmVob3VzZXMoKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgV2FyZWhvdXNlRHRvW10pKVxyXG4gICAgICApLFxyXG4gICAgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHsgcGFyYW1zLCB3YXJlaG91c2VzIH0pID0+IHtcclxuICAgICAgICB0aGlzLndhcmVob3VzZXMgPSB3YXJlaG91c2VzO1xyXG4gICAgICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgICAgIHRoaXMuZm9ybS5lcnBUeXBlICAgICAgICAgICAgID0gcGFyYW1zLmVycFR5cGUgID8/ICdNSUtSTyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uYmFzZVVybCAgICAgICAgICAgICA9IHBhcmFtcy5iYXNlVXJsICA/PyAnJztcclxuICAgICAgICAgIHRoaXMuZm9ybS5hcGlLZXkgICAgICAgICAgICAgID0gcGFyYW1zLmFwaUtleSAgID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLnVzZXJuYW1lICAgICAgICAgICAgPSBwYXJhbXMudXNlcm5hbWUgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uaXNBY3RpdmUgICAgICAgICAgICA9IHBhcmFtcy5pc0FjdGl2ZTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5wYXNzd29yZCAgICAgICAgICAgID0gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUgICA9IHBhcmFtcy5mcm9tV2FyZWhvdXNlQ29kZSAgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0udGFyZ2V0V2FyZWhvdXNlQ29kZSA9IHBhcmFtcy50YXJnZXRXYXJlaG91c2VDb2RlID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmR1bW15Qm94Q29kZSAgICAgICAgPSBwYXJhbXMuZHVtbXlCb3hDb2RlID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmJlZUNlbGxVc2VybmFtZSAgICAgPSBwYXJhbXMuYmVlQ2VsbFVzZXJuYW1lID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmJlZUNlbGxQYXNzd29yZCAgICAgPSAnJztcclxuICAgICAgICAgIHRoaXMucGFzc3dvcmRTZXQgICAgICAgICAgICAgID0gcGFyYW1zLnBhc3N3b3JkU2V0O1xyXG4gICAgICAgICAgdGhpcy5iZWVDZWxsUGFzc3dvcmRTZXQgICAgICAgPSBwYXJhbXMuYmVlQ2VsbFBhc3N3b3JkU2V0ID8/IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBLYXnEsXRsxLEga2F5bmFrIGRlcG8gdmFyc2EsIER1bW15IEthc2EgY29tYm9ib3gnxLFuxLFuIG8gZGVwb3lhIGFpdCBkZXBvIHllcmxlcml5bGUgZG9sbWFzxLEgacOnaW4gecO8a2xlLlxyXG4gICAgICAgIGlmICh0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUpIHtcclxuICAgICAgICAgIHRoaXMubG9hZEJpbkxvY2F0aW9ucyh0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnI/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSA/PyAnUGFyYW1ldHJlbGVyIHnDvGtsZW5pcmtlbiBiaXIgaGF0YSBvbHXFn3R1LicpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBpc0N1cnJlbnRGcm9tV2hzSW5MaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMud2FyZWhvdXNlcy5zb21lKHcgPT4gdy5XaHNDb2RlID09PSB0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQ3VycmVudFdoc0luTGlzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLndhcmVob3VzZXMuc29tZSh3ID0+IHcuV2hzQ29kZSA9PT0gdGhpcy5mb3JtLnRhcmdldFdhcmVob3VzZUNvZGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQ3VycmVudER1bW15Qm94SW5MaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmluTG9jYXRpb25zLnNvbWUoYiA9PiBiLkJpbkNvZGUgPT09IHRoaXMuZm9ybS5kdW1teUJveENvZGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS2F5bmFrIERlcG8gc2XDp2ltaSBkZcSfacWfdGnEn2luZGUgw6dhbMSxxZ/EsXI6IER1bW15IEthc2EgY29tYm9ib3gnxLFuxLEgc2XDp2lsZW4gZGVwb251blxyXG4gICAqIGRlcG8geWVybGVyaXlsZSBkb2xkdXJ1ci4gRGVwbyBkZcSfacWfdGnEn2kgacOnaW4gw7ZuY2VraSBkZXBveWEgYWl0IHNlw6dpbSBhcnTEsWsgZ2XDp2VybGkgZGXEn2lsLlxyXG4gICAqL1xyXG4gIG9uRnJvbVdhcmVob3VzZUNoYW5nZSh3aHNDb2RlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybS5mcm9tV2FyZWhvdXNlQ29kZSA9IHdoc0NvZGU7XHJcbiAgICB0aGlzLmZvcm0uZHVtbXlCb3hDb2RlID0gJyc7XHJcbiAgICB0aGlzLmxvYWRCaW5Mb2NhdGlvbnMod2hzQ29kZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRCaW5Mb2NhdGlvbnMod2hzQ29kZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIXdoc0NvZGUpIHtcclxuICAgICAgdGhpcy5iaW5Mb2NhdGlvbnMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nQmluTG9jYXRpb25zID0gdHJ1ZTtcclxuICAgIHRoaXMud2FyZWhvdXNlU2VydmljZS5nZXRCaW5Mb2NhdGlvbnNCeVdhcmVob3VzZSh3aHNDb2RlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoYmlucykgPT4ge1xyXG4gICAgICAgIHRoaXMuYmluTG9jYXRpb25zID0gYmlucyB8fCBbXTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ0JpbkxvY2F0aW9ucyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYmluTG9jYXRpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdCaW5Mb2NhdGlvbnMgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtLmVycFR5cGUpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdFUlAgU2HEn2xhecSxY8Sxc8SxIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mb3JtLmJhc2VVcmw/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0Jhc2UgVVJMIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mb3JtLmFwaUtleT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignQVBJIEtleSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybS51c2VybmFtZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignS3VsbGFuxLFjxLEgQWTEsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucGFzc3dvcmRTZXQgJiYgIXRoaXMuZm9ybS5wYXNzd29yZD8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignxZ5pZnJlIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mb3JtLmJlZUNlbGxVc2VybmFtZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignQmVlQ2VsbCBLdWxsYW7EsWPEsSBBZMSxIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5iZWVDZWxsUGFzc3dvcmRTZXQgJiYgIXRoaXMuZm9ybS5iZWVDZWxsUGFzc3dvcmQ/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0JlZUNlbGwgxZ5pZnJlc2kgem9ydW5sdWR1ci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb25uZWN0b3JQYXJhbXNTZXJ2aWNlLnNhdmVDb25uZWN0b3JQYXJhbXModGhpcy5mb3JtKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKCdQYXJhbWV0cmVsZXIgYmHFn2FyxLF5bGEga2F5ZGVkaWxkaS4nKTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtLnBhc3N3b3JkKSB7XHJcbiAgICAgICAgICB0aGlzLnBhc3N3b3JkU2V0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5wYXNzd29yZCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5mb3JtLmJlZUNlbGxQYXNzd29yZCkge1xyXG4gICAgICAgICAgdGhpcy5iZWVDZWxsUGFzc3dvcmRTZXQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmJlZUNlbGxQYXNzd29yZCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHdWFyZCBjYWNoZSdpbmkgZ8O8bmNlbGxlIOKAlCBkacSfZXIgZWtyYW5sYXIgYXJ0xLFrIGVyacWfaWxlYmlsaXJcclxuICAgICAgICB0aGlzLmd1YXJkLmludmFsaWRhdGUoKTtcclxuICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoZXJyPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgPz8gJ0thecSxdCBzxLFyYXPEsW5kYSBiaXIgaGF0YSBvbHXFn3R1LicpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8YWJwLXBhZ2UgW3RpdGxlXT1cIidDb25uZWN0b3IgUGFyYW1ldHJlbGVyaSdcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29ubmVjdG9yLXBhcmFtcy1jb250YWluZXJcIj5cclxuXHJcbiAgICA8IS0tIFnDvGtsZW5peW9yIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTRcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5XCIgcm9sZT1cInN0YXR1c1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+WcO8a2xlbml5b3IuLi48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgY29ubmVjdG9yLXBhcmFtcy1jYXJkXCIgW2hpZGRlbl09XCJpc0xvYWRpbmdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG5cclxuICAgICAgICA8IS0tIEVSUCBTYcSfbGF5xLFjxLFzxLEgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJlcnBUeXBlU2VsZWN0XCI+RVJQIFNhxJ9sYXnEsWPEsXPEsSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgPHNlbGVjdCBpZD1cImVycFR5cGVTZWxlY3RcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJmb3JtLmVycFR5cGVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGVycE9wdGlvbnNcIiBbdmFsdWVdPVwib3B0LnZhbHVlXCI+e3sgb3B0LmxhYmVsIH19PC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBCYXNlIFVSTCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cImJhc2VVcmxJbnB1dFwiPkJhc2UgVVJMIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJiYXNlVXJsSW5wdXRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0uYmFzZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJodHRwczovL2VycC1zZXJ2ZXI6MzgwODBcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEFQSSBLZXkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJhcGlLZXlJbnB1dFwiPkFQSSBLZXkgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBpZD1cImFwaUtleUlucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmFwaUtleVwiXHJcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBUEkgYW5haHRhcsSxXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBLdWxsYW7EsWPEsSBBZMSxIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwidXNlcm5hbWVJbnB1dFwiPkt1bGxhbsSxY8SxIEFkxLEgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBpZD1cInVzZXJuYW1lSW5wdXRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0udXNlcm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiS3VsbGFuxLFjxLEgYWTEsVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gxZ5pZnJlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwicGFzc3dvcmRJbnB1dFwiPlxyXG4gICAgICAgICAgICDFnmlmcmUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2VzcyBtcy0yXCIgKm5nSWY9XCJwYXNzd29yZFNldCAmJiAhZm9ybS5wYXNzd29yZFwiPkthecSxdGzEsTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJwYXNzd29yZElucHV0XCIgdHlwZT1cInBhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybS5wYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBhc3N3b3JkU2V0ID8gJ0RlxJ9pxZ90aXJtZWsgacOnaW4geWVuaSDFn2lmcmUgZ2lyaW4sIGJvxZ8gYsSxcmFrxLFyc2FuxLF6IG1ldmN1dCDFn2lmcmUga29ydW51cicgOiAnxZ5pZnJlJ1wiIC8+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJwYXNzd29yZFNldFwiPk1ldmN1dCDFn2lmcmV5aSBrb3J1bWFrIGnDp2luIGJvxZ8gYsSxcmFrxLFuLjwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQmVlQ2VsbCBLdWxsYW7EsWPEsSBBZMSxIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiYmVlQ2VsbFVzZXJuYW1lSW5wdXRcIj5CZWVDZWxsIEt1bGxhbsSxY8SxIEFkxLEgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBpZD1cImJlZUNlbGxVc2VybmFtZUlucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmJlZUNlbGxVc2VybmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCZWVDZWxsIGt1bGxhbsSxY8SxIGFkxLFcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPkJlZUNlbGwvT3JjaGVzdHJhdG9yIEFQSSBnaXJpxZ9pIGnDp2luIGt1bGxhbsSxbMSxciAoRVJQIGt1bGxhbsSxY8Sxc8SxbmRhbiBheXLEsWTEsXIpLjwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQmVlQ2VsbCDFnmlmcmUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJiZWVDZWxsUGFzc3dvcmRJbnB1dFwiPlxyXG4gICAgICAgICAgICBCZWVDZWxsIMWeaWZyZSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zdWNjZXNzIG1zLTJcIiAqbmdJZj1cImJlZUNlbGxQYXNzd29yZFNldCAmJiAhZm9ybS5iZWVDZWxsUGFzc3dvcmRcIj5LYXnEsXRsxLE8L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IGlkPVwiYmVlQ2VsbFBhc3N3b3JkSW5wdXRcIiB0eXBlPVwicGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmJlZUNlbGxQYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImJlZUNlbGxQYXNzd29yZFNldCA/ICdEZcSfacWfdGlybWVrIGnDp2luIHllbmkgxZ9pZnJlIGdpcmluLCBib8WfIGLEsXJha8SxcnNhbsSxeiBtZXZjdXQgxZ9pZnJlIGtvcnVudXInIDogJ0JlZUNlbGwgxZ9pZnJlc2knXCIgLz5cclxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cImJlZUNlbGxQYXNzd29yZFNldFwiPk1ldmN1dCDFn2lmcmV5aSBrb3J1bWFrIGnDp2luIGJvxZ8gYsSxcmFrxLFuLjwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gS2F5bmFrIERlcG8gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJmcm9tV2hzU2VsZWN0XCI+XHJcbiAgICAgICAgICAgIEtheW5hayBEZXBvIChTdG9rIFRyYW5zZmVyKVxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJmcm9tV2hzU2VsZWN0XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZvcm0uZnJvbVdhcmVob3VzZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZyb21XYXJlaG91c2VDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gU2XDp2luaXogLS08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImZvcm0uZnJvbVdhcmVob3VzZUNvZGUgJiYgIWlzQ3VycmVudEZyb21XaHNJbkxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmZyb21XYXJlaG91c2VDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgZm9ybS5mcm9tV2FyZWhvdXNlQ29kZSB9fSAoS2F5xLF0bMSxKVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgd2hzIG9mIHdhcmVob3VzZXNcIiBbdmFsdWVdPVwid2hzLldoc0NvZGVcIj5cclxuICAgICAgICAgICAgICB7eyB3aHMuV2hzQ29kZSB9fSDigJMge3sgd2hzLldoc05hbWUgfX1cclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5Hw7ZyZXYgQmHFn2xhdCd0YSBvbHXFn3R1cnVsYW4gc3RvayBuYWtsaW5pbiBrYXluYWsgZGVwb3N1Ljwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gSGVkZWYgRGVwbyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cInRhcmdldFdoc1NlbGVjdFwiPlxyXG4gICAgICAgICAgICBIZWRlZiBEZXBvIChTdG9rIFRyYW5zZmVyKSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8c2VsZWN0IGlkPVwidGFyZ2V0V2hzU2VsZWN0XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZcOnaW5peiAtLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlICYmICFpc0N1cnJlbnRXaHNJbkxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLnRhcmdldFdhcmVob3VzZUNvZGVcIj5cclxuICAgICAgICAgICAgICB7eyBmb3JtLnRhcmdldFdhcmVob3VzZUNvZGUgfX0gKEthecSxdGzEsSlcclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHdocyBvZiB3YXJlaG91c2VzXCIgW3ZhbHVlXT1cIndocy5XaHNDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgd2hzLldoc0NvZGUgfX0g4oCTIHt7IHdocy5XaHNOYW1lIH19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+R8O2cmV2IEJhxZ9sYXQndGEgb2x1xZ90dXJ1bGFuIHN0b2sgbmFrbGluaW4gaGVkZWYgZGVwb3N1Ljwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRHVtbXkgS2FzYSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cImR1bW15Qm94U2VsZWN0XCI+RHVtbXkgS2FzYSBLb2R1PC9sYWJlbD5cclxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkdW1teUJveFNlbGVjdFwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0uZHVtbXlCb3hDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtLmZyb21XYXJlaG91c2VDb2RlIHx8IGlzTG9hZGluZ0JpbkxvY2F0aW9uc1wiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gU2XDp2luaXogLS08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImZvcm0uZHVtbXlCb3hDb2RlICYmICFpc0N1cnJlbnREdW1teUJveEluTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZHVtbXlCb3hDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgZm9ybS5kdW1teUJveENvZGUgfX0gKEthecSxdGzEsSlcclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGJpbiBvZiBiaW5Mb2NhdGlvbnNcIiBbdmFsdWVdPVwiYmluLkJpbkNvZGVcIj5cclxuICAgICAgICAgICAgICB7eyBiaW4uQmluQ29kZSB9fVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwiIWZvcm0uZnJvbVdhcmVob3VzZUNvZGVcIj7Dlm5jZSBLYXluYWsgRGVwbyBzZcOnaW4uPC9zbWFsbD5cclxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cImlzTG9hZGluZ0JpbkxvY2F0aW9uc1wiPkRlcG8geWVybGVyaSB5w7xrbGVuaXlvci4uLjwvc21hbGw+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJmb3JtLmZyb21XYXJlaG91c2VDb2RlICYmICFpc0xvYWRpbmdCaW5Mb2NhdGlvbnNcIj5cclxuICAgICAgICAgICAgS2FzYSBNaWt0YXLEsSBHw7xuY2VsbGVtZSdkZSBmaWlsaSBzYXnEsW0gZmFya8SxbsSxbiBtdWhhc2ViZWxlxZ90aXJpbGRpxJ9pIFNBUCBiaW4ga29kdSDigJQgc2XDp2lsZW4ga2F5bmFrIGRlcG9udW4gZGVwbyB5ZXJpLlxyXG4gICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBa3RpZiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItNCBmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJpc0FjdGl2ZUNoZWNrXCIgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0uaXNBY3RpdmVcIiAvPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImlzQWN0aXZlQ2hlY2tcIj5Ba3RpZjwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gS2F5ZGV0IEJ1dG9udSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInNhdmUoKVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU2F2aW5nXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0xXCIgcm9sZT1cInN0YXR1c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAge3sgaXNTYXZpbmcgPyAnS2F5ZGVkaWxpeW9yLi4uJyA6ICdLYXlkZXQnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG48L2FicC1wYWdlPlxyXG4iXX0=
@@ -0,0 +1,41 @@
1
+ import { CoreModule } from '@abp/ng.core';
2
+ import { ThemeSharedModule } from '@abp/ng.theme.shared';
3
+ import { NgModule } from '@angular/core';
4
+ import { FormsModule } from '@angular/forms';
5
+ import { RouterModule } from '@angular/router';
6
+ import { PageModule } from '@abp/ng.components/page';
7
+ import { ConnectorParamsComponent } from './connector-params.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/router";
10
+ const routes = [
11
+ { path: '', component: ConnectorParamsComponent },
12
+ ];
13
+ export class ConnectorParamsModule {
14
+ }
15
+ ConnectorParamsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
+ ConnectorParamsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, declarations: [ConnectorParamsComponent], imports: [CoreModule,
17
+ ThemeSharedModule,
18
+ FormsModule,
19
+ PageModule, i1.RouterModule] });
20
+ ConnectorParamsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, imports: [CoreModule,
21
+ ThemeSharedModule,
22
+ FormsModule,
23
+ PageModule,
24
+ RouterModule.forChild(routes)] });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, decorators: [{
26
+ type: NgModule,
27
+ args: [{
28
+ declarations: [ConnectorParamsComponent],
29
+ imports: [
30
+ CoreModule,
31
+ ThemeSharedModule,
32
+ FormsModule,
33
+ PageModule,
34
+ RouterModule.forChild(routes),
35
+ ],
36
+ }]
37
+ }] });
38
+ export function loadConnectorParamsModuleAsChild() {
39
+ return Promise.resolve(ConnectorParamsModule);
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7QUFFeEUsTUFBTSxNQUFNLEdBQVc7SUFDckIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRTtDQUNsRCxDQUFDO0FBWUYsTUFBTSxPQUFPLHFCQUFxQjs7a0hBQXJCLHFCQUFxQjttSEFBckIscUJBQXFCLGlCQVRqQix3QkFBd0IsYUFFckMsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTttSEFJRCxxQkFBcUIsWUFQOUIsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTtRQUNWLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDOzJGQUdwQixxQkFBcUI7a0JBVmpDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsd0JBQXdCLENBQUM7b0JBQ3hDLE9BQU8sRUFBRTt3QkFDUCxVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsV0FBVzt3QkFDWCxVQUFVO3dCQUNWLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO3FCQUM5QjtpQkFDRjs7QUFHRCxNQUFNLFVBQVUsZ0NBQWdDO0lBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHsgVGhlbWVTaGFyZWRNb2R1bGUgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFBhZ2VNb2R1bGUgfSBmcm9tICdAYWJwL25nLmNvbXBvbmVudHMvcGFnZSc7XHJcbmltcG9ydCB7IENvbm5lY3RvclBhcmFtc0NvbXBvbmVudCB9IGZyb20gJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQnO1xyXG5cclxuY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXHJcbiAgeyBwYXRoOiAnJywgY29tcG9uZW50OiBDb25uZWN0b3JQYXJhbXNDb21wb25lbnQgfSxcclxuXTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbQ29ubmVjdG9yUGFyYW1zQ29tcG9uZW50XSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb3JlTW9kdWxlLFxyXG4gICAgVGhlbWVTaGFyZWRNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFBhZ2VNb2R1bGUsXHJcbiAgICBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29ubmVjdG9yUGFyYW1zTW9kdWxlIHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZENvbm5lY3RvclBhcmFtc01vZHVsZUFzQ2hpbGQoKSB7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb25uZWN0b3JQYXJhbXNNb2R1bGUpO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,160 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../hit-proxy/order-station/order-station.service";
4
+ import * as i2 from "@abp/ng.theme.shared";
5
+ import * as i3 from "@angular/common";
6
+ import * as i4 from "@angular/forms";
7
+ import * as i5 from "@abp/ng.components/page";
8
+ export class OrderStationComponent {
9
+ constructor(orderStationService, toasterService) {
10
+ this.orderStationService = orderStationService;
11
+ this.toasterService = toasterService;
12
+ this.stationCode = '';
13
+ this.eyeCode = '';
14
+ this.absBinEntry = '';
15
+ this.orderId = '';
16
+ this.isSaving = false;
17
+ this.isCheckingOrder = false;
18
+ this.orderStatus = null;
19
+ }
20
+ ngAfterViewInit() {
21
+ setTimeout(() => {
22
+ this.stationInputRef?.nativeElement?.focus();
23
+ }, 200);
24
+ }
25
+ onStationScanned() {
26
+ if (!this.stationCode?.trim())
27
+ return;
28
+ setTimeout(() => {
29
+ this.shelfInputRef?.nativeElement?.focus();
30
+ }, 100);
31
+ }
32
+ onShelfScanned() {
33
+ if (!this.eyeCode?.trim())
34
+ return;
35
+ setTimeout(() => {
36
+ this.binInputRef?.nativeElement?.focus();
37
+ }, 100);
38
+ }
39
+ onBinScanned() {
40
+ if (!this.absBinEntry?.trim())
41
+ return;
42
+ setTimeout(() => {
43
+ this.orderInputRef?.nativeElement?.focus();
44
+ }, 100);
45
+ }
46
+ onOrderChanged() {
47
+ this.orderStatus = null;
48
+ }
49
+ onOrderScanned() {
50
+ if (!this.orderId?.trim())
51
+ return;
52
+ const orderIdNum = Number(this.orderId.trim());
53
+ if (isNaN(orderIdNum)) {
54
+ this.toasterService.warn('Sipariş alanı sayısal bir değer olmalıdır.');
55
+ return;
56
+ }
57
+ this.checkOrderStatus(orderIdNum);
58
+ }
59
+ checkOrderStatus(docEntry) {
60
+ this.isCheckingOrder = true;
61
+ this.orderStatus = null;
62
+ this.orderStationService.getOrderStatus(docEntry).subscribe({
63
+ next: (result) => {
64
+ console.log(result);
65
+ this.orderStatus = result;
66
+ this.isCheckingOrder = false;
67
+ if (!result.IsEligibleForMatching) {
68
+ this.toasterService.error(`Bu siparişin durumu ${result.StatusText}. Eşleştirme işlemi yapılamaz.`);
69
+ }
70
+ },
71
+ error: (error) => {
72
+ const errorMessage = error?.error?.error?.message || 'Sipariş durumu kontrol edilemedi.';
73
+ this.toasterService.error(errorMessage);
74
+ this.isCheckingOrder = false;
75
+ this.orderStatus = null;
76
+ },
77
+ });
78
+ }
79
+ onSave() {
80
+ if (!this.stationCode?.trim()) {
81
+ this.toasterService.warn('İstasyon alanı zorunludur.');
82
+ return;
83
+ }
84
+ if (!this.eyeCode?.trim()) {
85
+ this.toasterService.warn('Raf alanı zorunludur.');
86
+ return;
87
+ }
88
+ if (!this.absBinEntry?.trim()) {
89
+ this.toasterService.warn('Toplanacak Kasa alanı zorunludur.');
90
+ return;
91
+ }
92
+ if (!this.orderId?.trim()) {
93
+ this.toasterService.warn('Sipariş alanı zorunludur.');
94
+ return;
95
+ }
96
+ const eyeCodeNum = this.eyeCode.trim();
97
+ const absBinEntryNum = Number(this.absBinEntry.trim());
98
+ const orderIdNum = Number(this.orderId.trim());
99
+ if (isNaN(absBinEntryNum)) {
100
+ this.toasterService.warn('Toplanacak Kasa alanı sayısal bir değer olmalıdır.');
101
+ return;
102
+ }
103
+ if (isNaN(orderIdNum)) {
104
+ this.toasterService.warn('Sipariş alanı sayısal bir değer olmalıdır.');
105
+ return;
106
+ }
107
+ if (this.orderStatus && !this.orderStatus.IsEligibleForMatching) {
108
+ this.toasterService.error(`Bu siparişin durumu ${this.orderStatus.StatusText}. Eşleştirme işlemi yapılamaz.`);
109
+ return;
110
+ }
111
+ const dto = {
112
+ orderId: orderIdNum,
113
+ stationCode: this.stationCode.trim(),
114
+ eyeCode: eyeCodeNum,
115
+ absBinEntry: absBinEntryNum,
116
+ };
117
+ this.isSaving = true;
118
+ this.orderStationService.createOrderStation(dto).subscribe({
119
+ next: (result) => {
120
+ this.toasterService.success(result);
121
+ this.onClear();
122
+ this.isSaving = false;
123
+ },
124
+ error: (error) => {
125
+ const errorMessage = error?.error?.error?.message || 'İşlem sırasında bir hata oluştu.';
126
+ this.toasterService.error(errorMessage);
127
+ this.isSaving = false;
128
+ },
129
+ });
130
+ }
131
+ onClear() {
132
+ this.stationCode = '';
133
+ this.eyeCode = '';
134
+ this.absBinEntry = '';
135
+ this.orderId = '';
136
+ this.orderStatus = null;
137
+ setTimeout(() => {
138
+ this.stationInputRef?.nativeElement?.focus();
139
+ }, 100);
140
+ }
141
+ }
142
+ OrderStationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OrderStationComponent, deps: [{ token: i1.OrderStationService }, { token: i2.ToasterService }], target: i0.ɵɵFactoryTarget.Component });
143
+ OrderStationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OrderStationComponent, selector: "lib-order-station", viewQueries: [{ propertyName: "stationInputRef", first: true, predicate: ["stationInput"], descendants: true }, { propertyName: "shelfInputRef", first: true, predicate: ["shelfInput"], descendants: true }, { propertyName: "binInputRef", first: true, predicate: ["binInput"], descendants: true }, { propertyName: "orderInputRef", first: true, predicate: ["orderInput"], descendants: true }], ngImport: i0, template: "<abp-page [title]=\"'Sipari\u015F-Toplama Noktas\u0131 E\u015Fle\u015Ftirme'\">\r\n <div class=\"order-station-container\">\r\n <div class=\"order-station-layout\">\r\n <div class=\"order-station-form-card\">\r\n\r\n <!-- \u0130stasyon -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"stationInput\">\u0130stasyon</label>\r\n <input #stationInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"stationInput\"\r\n [(ngModel)]=\"stationCode\"\r\n (keydown.enter)=\"onStationScanned()\"\r\n placeholder=\"\u0130stasyon kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Raf -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"shelfInput\">G\u00F6z</label>\r\n <input #shelfInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"shelfInput\"\r\n [(ngModel)]=\"eyeCode\"\r\n (keydown.enter)=\"onShelfScanned()\"\r\n placeholder=\"Raf kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Toplanacak Kasa -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"binInput\">Toplanacak Kasa</label>\r\n <input #binInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"binInput\"\r\n [(ngModel)]=\"absBinEntry\"\r\n (keydown.enter)=\"onBinScanned()\"\r\n placeholder=\"Toplanacak kasa kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"orderInput\">Sipari\u015F</label>\r\n <input #orderInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"orderInput\"\r\n [(ngModel)]=\"orderId\"\r\n (ngModelChange)=\"onOrderChanged()\"\r\n (keydown.enter)=\"onOrderScanned()\"\r\n placeholder=\"Sipari\u015F numaras\u0131n\u0131 okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F Durum Bilgisi -->\r\n <div class=\"form-section\" *ngIf=\"isCheckingOrder\">\r\n <div class=\"status-loading\">\r\n <i class=\"fa fa-spinner fa-spin\"></i> Sipari\u015F durumu kontrol ediliyor...\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-section\" *ngIf=\"orderStatus && !isCheckingOrder\">\r\n <div class=\"status-card\" [ngClass]=\"{\r\n 'status-ok': orderStatus.IsEligibleForMatching,\r\n 'status-error': !orderStatus.IsEligibleForMatching\r\n }\">\r\n <i class=\"fa\" [ngClass]=\"orderStatus.IsEligibleForMatching ? 'fa-check-circle' : 'fa-times-circle'\"></i>\r\n <span *ngIf=\"orderStatus.IsEligibleForMatching\">\r\n Sipari\u015F Durumu: {{ orderStatus.StatusText }}\r\n </span>\r\n <span *ngIf=\"!orderStatus.IsEligibleForMatching\">\r\n Bu sipari\u015Fin durumu {{ orderStatus.StatusText }}. E\u015Fle\u015Ftirme i\u015Flemi yap\u0131lamaz.\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"form-divider\" />\r\n\r\n <!-- Buttons -->\r\n <div class=\"form-section button-group\">\r\n <button class=\"btn btn-action-success btn-sm\"\r\n (click)=\"onSave()\"\r\n [disabled]=\"isSaving || isCheckingOrder || !stationCode || !eyeCode || !absBinEntry || !orderId || !orderStatus || !orderStatus.IsEligibleForMatching\">\r\n <i class=\"fa\" [ngClass]=\"isSaving ? 'fa-spinner fa-spin' : 'fa-save'\"></i>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n <button class=\"btn btn-action-outline btn-sm\"\r\n (click)=\"onClear()\"\r\n [disabled]=\"isSaving\">\r\n <i class=\"fa fa-eraser\"></i> Temizle\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", styles: [".order-station-container{width:100%}.order-station-layout{display:flex;gap:20px;align-items:flex-start;justify-content:center}.order-station-form-card{background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:20px 24px;box-shadow:0 1px 3px #0000000f;flex:0 0 500px;min-width:320px;max-width:500px}.form-divider{border:none;border-top:1px solid #eee;margin:14px 0}.form-section{margin-bottom:12px}.section-label{display:block;font-size:11px;font-weight:600;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.form-input{height:40px;border:1px solid #ced4da;border-radius:6px;padding:0 12px;font-size:14px;background:#fff;transition:border-color .15s;width:100%}.form-input:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.form-input[readonly]{background:#f5f5f5;color:#888}.status-loading{padding:10px 14px;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:6px;font-size:13px;color:#6c757d}.status-loading i{margin-right:6px;color:#556ee6}.status-card{padding:10px 14px;border-radius:6px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px}.status-card i{font-size:16px}.status-ok{background:#e8f5e9;border:1px solid #a5d6a7;color:#2e7d32}.status-ok i{color:#2e7d32}.status-error{background:#fbe9e7;border:1px solid #ef9a9a;color:#c62828}.status-error i{color:#c62828}.button-group{display:flex;gap:10px;margin-top:4px;flex-wrap:wrap}.button-group .btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:8px 20px;border-radius:6px;font-weight:500;white-space:nowrap;transition:all .15s;flex:1 1 0;justify-content:center;min-width:120px}.btn-action-success{background:#34c38f;color:#fff;border:none}.btn-action-success:hover{background:#2ca67a;color:#fff}.btn-action-success:disabled{background:#9dd3bd;color:#fff;cursor:not-allowed}.btn-action-outline{background:transparent;color:#556ee6;border:1px solid #556ee6}.btn-action-outline:hover{background:#556ee6;color:#fff}@media (max-width: 768px){.order-station-container{padding:0 8px}.order-station-form-card{padding:16px;min-width:100%;flex:1}.button-group{flex-direction:column}.button-group .btn{font-size:12px;padding:7px 14px;width:100%;flex:1 1 auto}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }] });
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OrderStationComponent, decorators: [{
145
+ type: Component,
146
+ args: [{ selector: 'lib-order-station', template: "<abp-page [title]=\"'Sipari\u015F-Toplama Noktas\u0131 E\u015Fle\u015Ftirme'\">\r\n <div class=\"order-station-container\">\r\n <div class=\"order-station-layout\">\r\n <div class=\"order-station-form-card\">\r\n\r\n <!-- \u0130stasyon -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"stationInput\">\u0130stasyon</label>\r\n <input #stationInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"stationInput\"\r\n [(ngModel)]=\"stationCode\"\r\n (keydown.enter)=\"onStationScanned()\"\r\n placeholder=\"\u0130stasyon kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Raf -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"shelfInput\">G\u00F6z</label>\r\n <input #shelfInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"shelfInput\"\r\n [(ngModel)]=\"eyeCode\"\r\n (keydown.enter)=\"onShelfScanned()\"\r\n placeholder=\"Raf kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Toplanacak Kasa -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"binInput\">Toplanacak Kasa</label>\r\n <input #binInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"binInput\"\r\n [(ngModel)]=\"absBinEntry\"\r\n (keydown.enter)=\"onBinScanned()\"\r\n placeholder=\"Toplanacak kasa kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"orderInput\">Sipari\u015F</label>\r\n <input #orderInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"orderInput\"\r\n [(ngModel)]=\"orderId\"\r\n (ngModelChange)=\"onOrderChanged()\"\r\n (keydown.enter)=\"onOrderScanned()\"\r\n placeholder=\"Sipari\u015F numaras\u0131n\u0131 okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F Durum Bilgisi -->\r\n <div class=\"form-section\" *ngIf=\"isCheckingOrder\">\r\n <div class=\"status-loading\">\r\n <i class=\"fa fa-spinner fa-spin\"></i> Sipari\u015F durumu kontrol ediliyor...\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-section\" *ngIf=\"orderStatus && !isCheckingOrder\">\r\n <div class=\"status-card\" [ngClass]=\"{\r\n 'status-ok': orderStatus.IsEligibleForMatching,\r\n 'status-error': !orderStatus.IsEligibleForMatching\r\n }\">\r\n <i class=\"fa\" [ngClass]=\"orderStatus.IsEligibleForMatching ? 'fa-check-circle' : 'fa-times-circle'\"></i>\r\n <span *ngIf=\"orderStatus.IsEligibleForMatching\">\r\n Sipari\u015F Durumu: {{ orderStatus.StatusText }}\r\n </span>\r\n <span *ngIf=\"!orderStatus.IsEligibleForMatching\">\r\n Bu sipari\u015Fin durumu {{ orderStatus.StatusText }}. E\u015Fle\u015Ftirme i\u015Flemi yap\u0131lamaz.\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"form-divider\" />\r\n\r\n <!-- Buttons -->\r\n <div class=\"form-section button-group\">\r\n <button class=\"btn btn-action-success btn-sm\"\r\n (click)=\"onSave()\"\r\n [disabled]=\"isSaving || isCheckingOrder || !stationCode || !eyeCode || !absBinEntry || !orderId || !orderStatus || !orderStatus.IsEligibleForMatching\">\r\n <i class=\"fa\" [ngClass]=\"isSaving ? 'fa-spinner fa-spin' : 'fa-save'\"></i>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n <button class=\"btn btn-action-outline btn-sm\"\r\n (click)=\"onClear()\"\r\n [disabled]=\"isSaving\">\r\n <i class=\"fa fa-eraser\"></i> Temizle\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", styles: [".order-station-container{width:100%}.order-station-layout{display:flex;gap:20px;align-items:flex-start;justify-content:center}.order-station-form-card{background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:20px 24px;box-shadow:0 1px 3px #0000000f;flex:0 0 500px;min-width:320px;max-width:500px}.form-divider{border:none;border-top:1px solid #eee;margin:14px 0}.form-section{margin-bottom:12px}.section-label{display:block;font-size:11px;font-weight:600;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.form-input{height:40px;border:1px solid #ced4da;border-radius:6px;padding:0 12px;font-size:14px;background:#fff;transition:border-color .15s;width:100%}.form-input:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.form-input[readonly]{background:#f5f5f5;color:#888}.status-loading{padding:10px 14px;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:6px;font-size:13px;color:#6c757d}.status-loading i{margin-right:6px;color:#556ee6}.status-card{padding:10px 14px;border-radius:6px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px}.status-card i{font-size:16px}.status-ok{background:#e8f5e9;border:1px solid #a5d6a7;color:#2e7d32}.status-ok i{color:#2e7d32}.status-error{background:#fbe9e7;border:1px solid #ef9a9a;color:#c62828}.status-error i{color:#c62828}.button-group{display:flex;gap:10px;margin-top:4px;flex-wrap:wrap}.button-group .btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:8px 20px;border-radius:6px;font-weight:500;white-space:nowrap;transition:all .15s;flex:1 1 0;justify-content:center;min-width:120px}.btn-action-success{background:#34c38f;color:#fff;border:none}.btn-action-success:hover{background:#2ca67a;color:#fff}.btn-action-success:disabled{background:#9dd3bd;color:#fff;cursor:not-allowed}.btn-action-outline{background:transparent;color:#556ee6;border:1px solid #556ee6}.btn-action-outline:hover{background:#556ee6;color:#fff}@media (max-width: 768px){.order-station-container{padding:0 8px}.order-station-form-card{padding:16px;min-width:100%;flex:1}.button-group{flex-direction:column}.button-group .btn{font-size:12px;padding:7px 14px;width:100%;flex:1 1 auto}}\n"] }]
147
+ }], ctorParameters: function () { return [{ type: i1.OrderStationService }, { type: i2.ToasterService }]; }, propDecorators: { stationInputRef: [{
148
+ type: ViewChild,
149
+ args: ['stationInput', { static: false }]
150
+ }], shelfInputRef: [{
151
+ type: ViewChild,
152
+ args: ['shelfInput', { static: false }]
153
+ }], binInputRef: [{
154
+ type: ViewChild,
155
+ args: ['binInput', { static: false }]
156
+ }], orderInputRef: [{
157
+ type: ViewChild,
158
+ args: ['orderInput', { static: false }]
159
+ }] } });
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItc3RhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL29yZGVyLXN0YXRpb24vb3JkZXItc3RhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL29yZGVyLXN0YXRpb24vb3JkZXItc3RhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQVNqRSxNQUFNLE9BQU8scUJBQXFCO0lBZ0JoQyxZQUNVLG1CQUF3QyxFQUN4QyxjQUE4QjtRQUQ5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQVp4QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFFckIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUVqQyxnQkFBVyxHQUEwQixJQUFJLENBQUM7SUFLdkMsQ0FBQztJQUVKLGVBQWU7UUFDYixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDL0MsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRTtZQUFFLE9BQU87UUFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZ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LG1CQUFtQjt1SUFLaUIsZUFBZTtzQkFBNUQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNBLGFBQWE7c0JBQXhELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDQSxXQUFXO3NCQUFwRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0ksYUFBYTtzQkFBeEQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3JkZXJTdGF0aW9uU2VydmljZSwgT3JkZXJTdGF0aW9uQ3JlYXRlRHRvLCBPcmRlclN0YXR1c0R0byB9IGZyb20gJy4uLy4uL2hpdC1wcm94eS9vcmRlci1zdGF0aW9uL29yZGVyLXN0YXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItb3JkZXItc3RhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL29yZGVyLXN0YXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL29yZGVyLXN0YXRpb24uY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyU3RhdGlvbkNvbXBvbmVudCB7XHJcbiAgQFZpZXdDaGlsZCgnc3RhdGlvbklucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHN0YXRpb25JbnB1dFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdzaGVsZklucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHNoZWxmSW5wdXRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnYmluSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgYmluSW5wdXRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnb3JkZXJJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBvcmRlcklucHV0UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBzdGF0aW9uQ29kZTogc3RyaW5nID0gJyc7XHJcbiAgZXllQ29kZTogc3RyaW5nID0gJyc7XHJcbiAgYWJzQmluRW50cnk6IHN0cmluZyA9ICcnO1xyXG4gIG9yZGVySWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ2hlY2tpbmdPcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBvcmRlclN0YXR1czogT3JkZXJTdGF0dXNEdG8gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG9yZGVyU3RhdGlvblNlcnZpY2U6IE9yZGVyU3RhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhdGlvbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIG9uU3RhdGlvblNjYW5uZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc3RhdGlvbkNvZGU/LnRyaW0oKSkgcmV0dXJuO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hlbGZJbnB1dFJlZj8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBvblNoZWxmU2Nhbm5lZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5leWVDb2RlPy50cmltKCkpIHJldHVybjtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmJpbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIG9uQmluU2Nhbm5lZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5hYnNCaW5FbnRyeT8udHJpbSgpKSByZXR1cm47XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcmRlcklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIG9uT3JkZXJDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcmRlclN0YXR1cyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBvbk9yZGVyU2Nhbm5lZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcmRlcklkPy50cmltKCkpIHJldHVybjtcclxuICAgIGNvbnN0IG9yZGVySWROdW0gPSBOdW1iZXIodGhpcy5vcmRlcklkLnRyaW0oKSk7XHJcbiAgICBpZiAoaXNOYU4ob3JkZXJJZE51bSkpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdTaXBhcmnFnyBhbGFuxLEgc2F5xLFzYWwgYmlyIGRlxJ9lciBvbG1hbMSxZMSxci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja09yZGVyU3RhdHVzKG9yZGVySWROdW0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja09yZGVyU3RhdHVzKGRvY0VudHJ5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNDaGVja2luZ09yZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMub3JkZXJTdGF0dXMgPSBudWxsO1xyXG4gICAgdGhpcy5vcmRlclN0YXRpb25TZXJ2aWNlLmdldE9yZGVyU3RhdHVzKGRvY0VudHJ5KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICB0aGlzLm9yZGVyU3RhdHVzID0gcmVzdWx0O1xyXG4gICAgICAgIHRoaXMuaXNDaGVja2luZ09yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQuSXNFbGlnaWJsZUZvck1hdGNoaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKFxyXG4gICAgICAgICAgICBgQnUgc2lwYXJpxZ9pbiBkdXJ1bXUgJHtyZXN1bHQuU3RhdHVzVGV4dH0uIEXFn2xlxZ90aXJtZSBpxZ9sZW1pIHlhcMSxbGFtYXouYFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnU2lwYXJpxZ8gZHVydW11IGtvbnRyb2wgZWRpbGVtZWRpLic7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuaXNDaGVja2luZ09yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vcmRlclN0YXR1cyA9IG51bGw7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zdGF0aW9uQ29kZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignxLBzdGFzeW9uIGFsYW7EsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZXllQ29kZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignUmFmIGFsYW7EsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuYWJzQmluRW50cnk/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ1RvcGxhbmFjYWsgS2FzYSBhbGFuxLEgem9ydW5sdWR1ci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLm9yZGVySWQ/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ1NpcGFyacWfIGFsYW7EsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXllQ29kZU51bSA9IHRoaXMuZXllQ29kZS50cmltKCk7XHJcbiAgICBjb25zdCBhYnNCaW5FbnRyeU51bSA9IE51bWJlcih0aGlzLmFic0JpbkVudHJ5LnRyaW0oKSk7XHJcbiAgICBjb25zdCBvcmRlcklkTnVtID0gTnVtYmVyKHRoaXMub3JkZXJJZC50cmltKCkpO1xyXG5cclxuICAgIGlmIChpc05hTihhYnNCaW5FbnRyeU51bSkpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdUb3BsYW5hY2FrIEthc2EgYWxhbsSxIHNhecSxc2FsIGJpciBkZcSfZXIgb2xtYWzEsWTEsXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpc05hTihvcmRlcklkTnVtKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ1NpcGFyacWfIGFsYW7EsSBzYXnEsXNhbCBiaXIgZGXEn2VyIG9sbWFsxLFkxLFyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3JkZXJTdGF0dXMgJiYgIXRoaXMub3JkZXJTdGF0dXMuSXNFbGlnaWJsZUZvck1hdGNoaW5nKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXHJcbiAgICAgICAgYEJ1IHNpcGFyacWfaW4gZHVydW11ICR7dGhpcy5vcmRlclN0YXR1cy5TdGF0dXNUZXh0fS4gRcWfbGXFn3Rpcm1lIGnFn2xlbWkgeWFwxLFsYW1hei5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkdG86IE9yZGVyU3RhdGlvbkNyZWF0ZUR0byA9IHtcclxuICAgICAgb3JkZXJJZDogb3JkZXJJZE51bSxcclxuICAgICAgc3RhdGlvbkNvZGU6IHRoaXMuc3RhdGlvbkNvZGUudHJpbSgpLFxyXG4gICAgICBleWVDb2RlOiBleWVDb2RlTnVtLFxyXG4gICAgICBhYnNCaW5FbnRyeTogYWJzQmluRW50cnlOdW0sXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5vcmRlclN0YXRpb25TZXJ2aWNlLmNyZWF0ZU9yZGVyU3RhdGlvbihkdG8pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICB0aGlzLm9uQ2xlYXIoKTtcclxuICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnxLDFn2xlbSBzxLFyYXPEsW5kYSBiaXIgaGF0YSBvbHXFn3R1Lic7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGlvbkNvZGUgPSAnJztcclxuICAgIHRoaXMuZXllQ29kZSA9ICcnO1xyXG4gICAgdGhpcy5hYnNCaW5FbnRyeSA9ICcnO1xyXG4gICAgdGhpcy5vcmRlcklkID0gJyc7XHJcbiAgICB0aGlzLm9yZGVyU3RhdHVzID0gbnVsbDtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN0YXRpb25JbnB1dFJlZj8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG59XHJcbiIsIjxhYnAtcGFnZSBbdGl0bGVdPVwiJ1NpcGFyacWfLVRvcGxhbWEgTm9rdGFzxLEgRcWfbGXFn3Rpcm1lJ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJvcmRlci1zdGF0aW9uLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm9yZGVyLXN0YXRpb24tbGF5b3V0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJvcmRlci1zdGF0aW9uLWZvcm0tY2FyZFwiPlxyXG5cclxuICAgICAgICA8IS0tIMSwc3Rhc3lvbiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWN0aW9uLWxhYmVsXCIgZm9yPVwic3RhdGlvbklucHV0XCI+xLBzdGFzeW9uPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCAjc3RhdGlvbklucHV0XHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIGlkPVwic3RhdGlvbklucHV0XCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRpb25Db2RlXCJcclxuICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblN0YXRpb25TY2FubmVkKClcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwixLBzdGFzeW9uIGtvZHVudSBva3V0dW4uLi5cIlxyXG4gICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUmFmIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNlY3Rpb24tbGFiZWxcIiBmb3I9XCJzaGVsZklucHV0XCI+R8O2ejwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgI3NoZWxmSW5wdXRcclxuICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgaWQ9XCJzaGVsZklucHV0XCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImV5ZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uU2hlbGZTY2FubmVkKClcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmFmIGtvZHVudSBva3V0dW4uLi5cIlxyXG4gICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gVG9wbGFuYWNhayBLYXNhIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNlY3Rpb24tbGFiZWxcIiBmb3I9XCJiaW5JbnB1dFwiPlRvcGxhbmFjYWsgS2FzYTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgI2JpbklucHV0XHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIGlkPVwiYmluSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWJzQmluRW50cnlcIlxyXG4gICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uQmluU2Nhbm5lZCgpXCJcclxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRvcGxhbmFjYWsga2FzYSBrb2R1bnUgb2t1dHVuLi4uXCJcclxuICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNpcGFyacWfIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNlY3Rpb24tbGFiZWxcIiBmb3I9XCJvcmRlcklucHV0XCI+U2lwYXJpxZ88L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0ICNvcmRlcklucHV0XHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIGlkPVwib3JkZXJJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcmRlcklkXCJcclxuICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk9yZGVyQ2hhbmdlZCgpXCJcclxuICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbk9yZGVyU2Nhbm5lZCgpXCJcclxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNpcGFyacWfIG51bWFyYXPEsW7EsSBva3V0dW4uLi5cIlxyXG4gICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2lwYXJpxZ8gRHVydW0gQmlsZ2lzaSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgKm5nSWY9XCJpc0NoZWNraW5nT3JkZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtbG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiPjwvaT4gU2lwYXJpxZ8gZHVydW11IGtvbnRyb2wgZWRpbGl5b3IuLi5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgKm5nSWY9XCJvcmRlclN0YXR1cyAmJiAhaXNDaGVja2luZ09yZGVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWNhcmRcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICdzdGF0dXMtb2snOiBvcmRlclN0YXR1cy5Jc0VsaWdpYmxlRm9yTWF0Y2hpbmcsXHJcbiAgICAgICAgICAgICdzdGF0dXMtZXJyb3InOiAhb3JkZXJTdGF0dXMuSXNFbGlnaWJsZUZvck1hdGNoaW5nXHJcbiAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBbbmdDbGFzc109XCJvcmRlclN0YXR1cy5Jc0VsaWdpYmxlRm9yTWF0Y2hpbmcgPyAnZmEtY2hlY2stY2lyY2xlJyA6ICdmYS10aW1lcy1jaXJjbGUnXCI+PC9pPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm9yZGVyU3RhdHVzLklzRWxpZ2libGVGb3JNYXRjaGluZ1wiPlxyXG4gICAgICAgICAgICAgIFNpcGFyacWfIER1cnVtdToge3sgb3JkZXJTdGF0dXMuU3RhdHVzVGV4dCB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIW9yZGVyU3RhdHVzLklzRWxpZ2libGVGb3JNYXRjaGluZ1wiPlxyXG4gICAgICAgICAgICAgIEJ1IHNpcGFyacWfaW4gZHVydW11IHt7IG9yZGVyU3RhdHVzLlN0YXR1c1RleHQgfX0uIEXFn2xlxZ90aXJtZSBpxZ9sZW1pIHlhcMSxbGFtYXouXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8aHIgY2xhc3M9XCJmb3JtLWRpdmlkZXJcIiAvPlxyXG5cclxuICAgICAgICA8IS0tIEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbiBidXR0b24tZ3JvdXBcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1zdWNjZXNzIGJ0bi1zbVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNhdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZyB8fCBpc0NoZWNraW5nT3JkZXIgfHwgIXN0YXRpb25Db2RlIHx8ICFleWVDb2RlIHx8ICFhYnNCaW5FbnRyeSB8fCAhb3JkZXJJZCB8fCAhb3JkZXJTdGF0dXMgfHwgIW9yZGVyU3RhdHVzLklzRWxpZ2libGVGb3JNYXRjaGluZ1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhXCIgW25nQ2xhc3NdPVwiaXNTYXZpbmcgPyAnZmEtc3Bpbm5lciBmYS1zcGluJyA6ICdmYS1zYXZlJ1wiPjwvaT5cclxuICAgICAgICAgICAge3sgaXNTYXZpbmcgPyAnS2F5ZGVkaWxpeW9yLi4uJyA6ICdLYXlkZXQnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1vdXRsaW5lIGJ0bi1zbVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsZWFyKClcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmdcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lcmFzZXJcIj48L2k+IFRlbWl6bGVcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9hYnAtcGFnZT5cclxuIl19