@colijnit/transaction 12.1.87 → 12.1.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/colijnit-transaction.umd.js +2746 -1972
- package/bundles/colijnit-transaction.umd.js.map +1 -1
- package/colijnit-transaction.d.ts +313 -304
- package/colijnit-transaction.metadata.json +1 -1
- package/esm2015/colijnit-transaction.js +314 -305
- package/esm2015/lib/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.js +11 -9
- package/esm2015/lib/component/core/base/transaction-base.component.js +11 -1
- package/esm2015/lib/component/core/base/transaction-filter-base.component.js +1 -8
- package/esm2015/lib/component/dialog/transaction-line/dialog-transaction-line-discount/dialog-transaction-line-discount.component.js +5 -5
- package/esm2015/lib/component/relation/relation-preferences/relation-preferences.component.js +27 -23
- package/esm2015/lib/component/search/search-header-buttons/search-header-buttons.component.js +6 -3
- package/esm2015/lib/component/search/search.component.js +5 -2
- package/esm2015/lib/component/transaction/transaction.component.js +10 -28
- package/esm2015/lib/component/transaction/transaction.module.js +5 -3
- package/esm2015/lib/component/transaction-allocate-goods-history/transaction-allocate-goods-history.component.js +8 -34
- package/esm2015/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-purchase-confirmation-button-bar-button.component.js +39 -0
- package/esm2015/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-purchase-receive-goods-button-bar-button.component.js +39 -0
- package/esm2015/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-sales-allocation-button-bar-button.component.js +39 -0
- package/esm2015/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-sales-delivery-button-bar-button.component.js +39 -0
- package/esm2015/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-sales-invoice-button-bar-button.component.js +39 -0
- package/esm2015/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-sales-purchase-button-bar-button.component.js +4 -5
- package/esm2015/lib/component/transaction-button-bar/transaction-button-bar.module.js +18 -3
- package/esm2015/lib/component/transaction-card/transaction-card/transaction-card.component.js +1 -2
- package/esm2015/lib/component/transaction-card/transaction-card-purchase-overview/transaction-card-purchase-overview.component.js +1 -2
- package/esm2015/lib/component/transaction-confirmation-details/transaction-confirmation-details.component.js +17 -22
- package/esm2015/lib/component/transaction-confirmation-history/transaction-confirmation-history.component.js +20 -47
- package/esm2015/lib/component/transaction-grid/transaction-available-stock-grid/transaction-available-stock-grid.component.js +8 -33
- package/esm2015/lib/component/transaction-line/transaction-goods-allocation-line/transaction-goods-allocation-line.component.js +24 -42
- package/esm2015/lib/component/transaction-line/transaction-invoice-line/transaction-invoice-line.component.js +87 -0
- package/esm2015/lib/component/transaction-line/transaction-invoice-line/transaction-invoice-line.module.js +36 -0
- package/esm2015/lib/component/transaction-line/transaction-line/transaction-line.component.js +2 -16
- package/esm2015/lib/component/transaction-line/transaction-order-delivery-line/transaction-order-delivery-line.component.js +23 -59
- package/esm2015/lib/component/transaction-line/transaction-purchase-line/transaction-purchase-line.component.js +13 -16
- package/esm2015/lib/component/transaction-line/transaction-purchase-line/transaction-purchase-line.module.js +6 -2
- package/esm2015/lib/component/transaction-line/transaction-purchase-order-line/transaction-purchase-order-line.component.js +24 -32
- package/esm2015/lib/component/transaction-line/transaction-purchase-overview-line/transaction-purchase-overview-line.component.js +99 -0
- package/esm2015/lib/component/transaction-line/transaction-purchase-overview-line/transaction-purchase-overview-line.module.js +41 -0
- package/esm2015/lib/component/transaction-line/transaction-receive-goods-line/transaction-receive-goods-line.component.js +41 -53
- package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-method.component.js +2 -2
- package/esm2015/lib/component/transaction-line-fields/transaction-line-discount-button.component.js +1 -11
- package/esm2015/lib/component/transaction-line-fields/transaction-line-price-list.component.js +2 -2
- package/esm2015/lib/component/transaction-line-fields/transaction-line-warehouse-location-button.component.js +5 -12
- package/esm2015/lib/component/transaction-line-fields/transaction-line-warehouse-location-button.module.js +4 -2
- package/esm2015/lib/component/transaction-line-fields/transaction-line-warehouse-location.component.js +1 -1
- package/esm2015/lib/component/transaction-line-fields/transaction-purchase-portal-line-confirmed-delivery-date.component.js +3 -1
- package/esm2015/lib/component/transaction-line-fields/transaction-purchase-portal-line-confirmed-price.component.js +7 -3
- package/esm2015/lib/component/transaction-line-fields/transaction-purchase-portal-line-gross-order-price.component.js +7 -3
- package/esm2015/lib/component/transaction-line-fields/transaction-purchase-portal-line-net-order-price.component.js +7 -3
- package/esm2015/lib/component/transaction-line-purchase-confirmation/transaction-line-purchase-confirmation.component.js +173 -0
- package/esm2015/lib/component/transaction-line-purchase-confirmation/transaction-line-purchase-confirmation.module.js +30 -0
- package/esm2015/lib/component/transaction-line-purchase-receive-goods/transaction-line-purchase-receive-goods.component.js +223 -0
- package/esm2015/lib/component/transaction-line-purchase-receive-goods/transaction-line-purchase-receive-goods.module.js +34 -0
- package/esm2015/lib/component/transaction-line-sales-allocation/transaction-line-sales-allocation.component.js +175 -0
- package/esm2015/lib/component/transaction-line-sales-allocation/transaction-line-sales-allocation.module.js +28 -0
- package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.component.js +6 -22
- package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.module.js +1 -1
- package/esm2015/lib/component/transaction-line-side-panel-purchase/transaction-line-side-panel-purchase.component.js +7 -50
- package/esm2015/lib/component/transaction-line-side-panel-purchase/transaction-line-side-panel-purchase.module.js +5 -3
- package/esm2015/lib/component/transaction-line-side-panel-sales/transaction-line-side-panel-sales.component.js +7 -48
- package/esm2015/lib/component/transaction-line-side-panel-sales/transaction-line-side-panel-sales.module.js +4 -4
- package/esm2015/lib/component/transaction-line-statusbar/transaction-line-statusbar.component.js +11 -9
- package/esm2015/lib/component/transaction-lines/transaction-lines.component.js +12 -38
- package/esm2015/lib/component/transaction-navigation-button/transaction-navigation-button.component.js +40 -0
- package/esm2015/lib/component/transaction-navigation-button/transaction-navigation-button.module.js +23 -0
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access/transaction-quick-access.module.js +4 -2
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-goods-allocation/transaction-quick-access-goods-allocation.component.js +5 -7
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-invoice/transaction-quick-access-invoice.component.js +128 -0
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-invoice/transaction-quick-access-invoice.module.js +27 -0
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-order-confirmation/transaction-quick-access-order-confirmation.component.js +5 -12
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-order-delivery/transaction-quick-access-order-delivery.component.js +30 -22
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-order-purchase/transaction-quick-access-order-purchase.component.js +5 -3
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-received-goods/transaction-quick-access-received-goods.component.js +35 -45
- package/esm2015/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.component.js +8 -31
- package/esm2015/lib/component/transaction-search/service/transaction-search.service.js +1 -1
- package/esm2015/lib/component/transaction-search/transaction-filter/transaction-filter/transaction-filter.component.js +7 -12
- package/esm2015/lib/component/transaction-search/transaction-search-grid/transaction-search-grid/transaction-search-grid.component.js +4 -12
- package/esm2015/lib/component/transaction-search/transaction-search-result/transaction-search-result.component.js +1 -4
- package/esm2015/lib/component/transaction-search/transaction-search-tile/transaction-search-tile/transaction-search-tile.component.js +3 -11
- package/esm2015/lib/component/transaction-search/transaction-search.component.js +5 -16
- package/esm2015/lib/enum/icon.enum.js +2 -1
- package/esm2015/lib/model/icon-svg.js +2 -1
- package/esm2015/lib/res/dictionary/dictionaries.js +3 -3
- package/esm2015/lib/service/pending-reason.service.js +202 -1
- package/esm2015/lib/service/transaction-connector-adapter.service.js +115 -15
- package/esm2015/lib/service/transaction-connector.service.js +39 -1
- package/esm2015/lib/service/transaction-event.service.js +19 -3
- package/esm2015/lib/service/transaction-mapping.service.js +16 -9
- package/esm2015/lib/service/transaction.service.js +256 -57
- package/fesm2015/colijnit-transaction.js +2428 -1752
- package/fesm2015/colijnit-transaction.js.map +1 -1
- package/lib/component/core/base/transaction-base.component.d.ts +3 -1
- package/lib/component/core/base/transaction-filter-base.component.d.ts +0 -3
- package/lib/component/relation/relation-preferences/relation-preferences.component.d.ts +7 -5
- package/lib/component/search/search-header-buttons/search-header-buttons.component.d.ts +1 -1
- package/lib/component/search/search.component.d.ts +1 -0
- package/lib/component/transaction/transaction.component.d.ts +1 -1
- package/lib/component/transaction-allocate-goods-history/transaction-allocate-goods-history.component.d.ts +4 -12
- package/lib/component/transaction-button-bar/style/_layout.scss +6 -1
- package/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-purchase-confirmation-button-bar-button.component.d.ts +12 -0
- package/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-purchase-receive-goods-button-bar-button.component.d.ts +12 -0
- package/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-sales-allocation-button-bar-button.component.d.ts +12 -0
- package/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-sales-delivery-button-bar-button.component.d.ts +12 -0
- package/lib/component/transaction-button-bar/transaction-button-bar-button/transaction-sales-invoice-button-bar-button.component.d.ts +12 -0
- package/lib/component/transaction-card/transaction-card/transaction-card.component.d.ts +0 -1
- package/lib/component/transaction-card/transaction-card-purchase-overview/transaction-card-purchase-overview.component.d.ts +0 -1
- package/lib/component/transaction-confirmation-details/transaction-confirmation-details.component.d.ts +4 -10
- package/lib/component/transaction-confirmation-history/transaction-confirmation-history.component.d.ts +5 -16
- package/lib/component/transaction-grid/transaction-available-stock-grid/transaction-available-stock-grid.component.d.ts +4 -20
- package/lib/component/transaction-line/transaction-goods-allocation-line/transaction-goods-allocation-line.component.d.ts +1 -8
- package/lib/component/transaction-line/transaction-invoice-line/style/_layout.scss +44 -0
- package/lib/component/transaction-line/transaction-invoice-line/style/_material-definition.scss +0 -0
- package/lib/component/transaction-line/transaction-invoice-line/style/_theme.scss +4 -0
- package/lib/component/{transaction-grid/transaction-received-goods-grid → transaction-line/transaction-invoice-line}/style/material.scss +0 -0
- package/lib/component/transaction-line/transaction-invoice-line/transaction-invoice-line.component.d.ts +16 -0
- package/lib/component/transaction-line/transaction-invoice-line/transaction-invoice-line.module.d.ts +2 -0
- package/lib/component/transaction-line/transaction-line/transaction-line.component.d.ts +0 -1
- package/lib/component/transaction-line/transaction-order-delivery-line/transaction-order-delivery-line.component.d.ts +1 -8
- package/lib/component/transaction-line/transaction-purchase-line/style/_layout.scss +3 -0
- package/lib/component/transaction-line/transaction-purchase-line/transaction-purchase-line.component.d.ts +1 -2
- package/lib/component/transaction-line/transaction-purchase-order-line/transaction-purchase-order-line.component.d.ts +1 -11
- package/lib/component/transaction-line/transaction-purchase-overview-line/style/_layout.scss +7 -0
- package/lib/component/transaction-line/transaction-purchase-overview-line/style/_material-definition.scss +0 -0
- package/lib/component/transaction-line/transaction-purchase-overview-line/style/_theme.scss +4 -0
- package/lib/component/transaction-line/transaction-purchase-overview-line/style/material.scss +4 -0
- package/lib/component/transaction-line/transaction-purchase-overview-line/transaction-purchase-overview-line.component.d.ts +20 -0
- package/lib/component/transaction-line/transaction-purchase-overview-line/transaction-purchase-overview-line.module.d.ts +2 -0
- package/lib/component/transaction-line/transaction-receive-goods-line/transaction-receive-goods-line.component.d.ts +8 -11
- package/lib/component/transaction-line-fields/transaction-line-discount-button.component.d.ts +0 -1
- package/lib/component/transaction-line-fields/transaction-line-warehouse-location-button.component.d.ts +1 -4
- package/lib/component/transaction-line-fields/transaction-purchase-portal-line-confirmed-price.component.d.ts +1 -0
- package/lib/component/transaction-line-fields/transaction-purchase-portal-line-gross-order-price.component.d.ts +1 -0
- package/lib/component/transaction-line-fields/transaction-purchase-portal-line-net-order-price.component.d.ts +1 -0
- package/lib/component/transaction-line-purchase-confirmation/style/_layout.scss +88 -0
- package/lib/component/transaction-line-purchase-confirmation/style/_material-definition.scss +4 -0
- package/lib/component/transaction-line-purchase-confirmation/style/_theme.scss +4 -0
- package/lib/component/transaction-line-purchase-confirmation/style/material.scss +5 -0
- package/lib/component/transaction-line-purchase-confirmation/transaction-line-purchase-confirmation.component.d.ts +32 -0
- package/lib/component/transaction-line-purchase-confirmation/transaction-line-purchase-confirmation.module.d.ts +2 -0
- package/lib/component/transaction-line-purchase-receive-goods/style/_layout.scss +71 -0
- package/lib/component/{transaction-grid/transaction-received-goods-grid → transaction-line-purchase-receive-goods}/style/_material-definition.scss +0 -0
- package/lib/component/transaction-line-purchase-receive-goods/style/_theme.scss +4 -0
- package/lib/component/{transaction-side-panel-edit-request-details → transaction-line-purchase-receive-goods}/style/material.scss +0 -0
- package/lib/component/transaction-line-purchase-receive-goods/transaction-line-purchase-receive-goods.component.d.ts +39 -0
- package/lib/component/transaction-line-purchase-receive-goods/transaction-line-purchase-receive-goods.module.d.ts +2 -0
- package/lib/component/transaction-line-sales-allocation/style/_layout.scss +71 -0
- package/lib/component/transaction-line-sales-allocation/style/_material-definition.scss +0 -0
- package/lib/component/transaction-line-sales-allocation/style/_theme.scss +4 -0
- package/lib/component/transaction-line-sales-allocation/style/material.scss +4 -0
- package/lib/component/transaction-line-sales-allocation/transaction-line-sales-allocation.component.d.ts +31 -0
- package/lib/component/transaction-line-sales-allocation/transaction-line-sales-allocation.module.d.ts +2 -0
- package/lib/component/transaction-line-side-panel/style/material.scss +3 -1
- package/lib/component/transaction-line-side-panel/transaction-line-side-panel.component.d.ts +1 -5
- package/lib/component/transaction-line-side-panel-purchase/style/material.scss +2 -1
- package/lib/component/transaction-line-side-panel-purchase/transaction-line-side-panel-purchase.component.d.ts +0 -1
- package/lib/component/transaction-line-side-panel-sales/style/material.scss +1 -0
- package/lib/component/transaction-line-side-panel-sales/transaction-line-side-panel-sales.component.d.ts +2 -15
- package/lib/component/transaction-lines/style/material.scss +2 -0
- package/lib/component/transaction-lines/transaction-lines.component.d.ts +1 -8
- package/lib/component/transaction-navigation-button/style/_layout.scss +4 -0
- package/lib/component/transaction-navigation-button/style/_material-definition.scss +0 -0
- package/lib/component/transaction-navigation-button/style/_theme.scss +4 -0
- package/lib/component/transaction-navigation-button/style/material.scss +4 -0
- package/lib/component/transaction-navigation-button/transaction-navigation-button.component.d.ts +13 -0
- package/lib/component/transaction-navigation-button/transaction-navigation-button.module.d.ts +2 -0
- package/lib/component/transaction-quick-access/transaction-quick-access/style/material.scss +1 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-goods-allocation/transaction-quick-access-goods-allocation.component.d.ts +1 -3
- package/lib/component/transaction-quick-access/transaction-quick-access-invoice/style/_layout.scss +12 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-invoice/style/_material-definition.scss +0 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-invoice/style/_theme.scss +4 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-invoice/style/material.scss +4 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-invoice/transaction-quick-access-invoice.component.d.ts +33 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-invoice/transaction-quick-access-invoice.module.d.ts +2 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-order-confirmation/transaction-quick-access-order-confirmation.component.d.ts +0 -1
- package/lib/component/transaction-quick-access/transaction-quick-access-order-delivery/transaction-quick-access-order-delivery.component.d.ts +5 -8
- package/lib/component/transaction-quick-access/transaction-quick-access-order-purchase/transaction-quick-access-order-purchase.component.d.ts +1 -1
- package/lib/component/transaction-quick-access/transaction-quick-access-received-goods/transaction-quick-access-received-goods.component.d.ts +6 -19
- package/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.component.d.ts +3 -10
- package/lib/component/transaction-search/service/transaction-search.service.d.ts +4 -2
- package/lib/component/transaction-search/transaction-filter/transaction-filter/transaction-filter.component.d.ts +3 -6
- package/lib/component/transaction-search/transaction-search-grid/transaction-search-grid/transaction-search-grid.component.d.ts +0 -4
- package/lib/component/transaction-search/transaction-search-result/transaction-search-result.component.d.ts +0 -2
- package/lib/component/transaction-search/transaction-search-tile/transaction-search-tile/transaction-search-tile.component.d.ts +0 -4
- package/lib/component/transaction-search/transaction-search.component.d.ts +0 -4
- package/lib/enum/icon.enum.d.ts +1 -0
- package/lib/res/dictionary/dictionaries.d.ts +11 -0
- package/lib/service/pending-reason.service.d.ts +34 -0
- package/lib/service/transaction-connector-adapter.service.d.ts +16 -5
- package/lib/service/transaction-connector.service.d.ts +16 -6
- package/lib/service/transaction-event.service.d.ts +18 -7
- package/lib/service/transaction.service.d.ts +20 -16
- package/package.json +2 -2
- package/esm2015/lib/component/transaction-grid/transaction-received-goods-grid/transaction-received-goods-grid.component.js +0 -155
- package/esm2015/lib/component/transaction-grid/transaction-received-goods-grid/transaction-received-goods-grid.module.js +0 -34
- package/esm2015/lib/component/transaction-line/transaction-goods-allocation-line/service/transaction-allocate-goods.service.js +0 -63
- package/esm2015/lib/component/transaction-line/transaction-order-delivery-line/service/transaction-order-delivery.service.js +0 -72
- package/esm2015/lib/component/transaction-line/transaction-receive-goods-line/service/transaction-receive-goods.service.js +0 -68
- package/esm2015/lib/component/transaction-side-panel-edit-request-details/components/allocation-request.component.js +0 -139
- package/esm2015/lib/component/transaction-side-panel-edit-request-details/components/receive-goods-request.component.js +0 -194
- package/esm2015/lib/component/transaction-side-panel-edit-request-details/transaction-side-panel-edit-request-details.component.js +0 -51
- package/esm2015/lib/component/transaction-side-panel-edit-request-details/transaction-side-panel-edit-request-details.module.js +0 -35
- package/esm2015/lib/model/extended-transaction-line-view-model.js +0 -4
- package/esm2015/lib/model/received-goods-view-model.js +0 -11
- package/lib/component/transaction-grid/transaction-received-goods-grid/style/_layout.scss +0 -17
- package/lib/component/transaction-grid/transaction-received-goods-grid/style/_theme.scss +0 -6
- package/lib/component/transaction-grid/transaction-received-goods-grid/transaction-received-goods-grid.component.d.ts +0 -37
- package/lib/component/transaction-grid/transaction-received-goods-grid/transaction-received-goods-grid.module.d.ts +0 -2
- package/lib/component/transaction-line/transaction-goods-allocation-line/service/transaction-allocate-goods.service.d.ts +0 -12
- package/lib/component/transaction-line/transaction-order-delivery-line/service/transaction-order-delivery.service.d.ts +0 -17
- package/lib/component/transaction-line/transaction-receive-goods-line/service/transaction-receive-goods.service.d.ts +0 -19
- package/lib/component/transaction-side-panel-edit-request-details/components/allocation-request.component.d.ts +0 -28
- package/lib/component/transaction-side-panel-edit-request-details/components/receive-goods-request.component.d.ts +0 -43
- package/lib/component/transaction-side-panel-edit-request-details/style/_layout.scss +0 -133
- package/lib/component/transaction-side-panel-edit-request-details/style/_material-definition.scss +0 -2
- package/lib/component/transaction-side-panel-edit-request-details/style/_theme.scss +0 -4
- package/lib/component/transaction-side-panel-edit-request-details/transaction-side-panel-edit-request-details.component.d.ts +0 -15
- package/lib/component/transaction-side-panel-edit-request-details/transaction-side-panel-edit-request-details.module.d.ts +0 -2
- package/lib/model/extended-transaction-line-view-model.d.ts +0 -11
- package/lib/model/received-goods-view-model.d.ts +0 -10
|
@@ -22,6 +22,8 @@ import { SupplierFullObject } from "@colijnit/relationapi/build/model/supplier-f
|
|
|
22
22
|
import { TransactionKind } from "@colijnit/transactionapi/build/enum/transaction-kind.enum";
|
|
23
23
|
import { RelationService } from "./relation.service";
|
|
24
24
|
import { Relation } from "@colijnit/relationapi/build/model/relation.bo";
|
|
25
|
+
import { GetPurchasePortalLine } from "@colijnit/transactionapi/build/model/get-purchase-portal-line";
|
|
26
|
+
import { PurchasePortalFilters } from "@colijnit/transactionapi/build/model/purchase-portal-filters.bo";
|
|
25
27
|
import * as i0 from "@angular/core";
|
|
26
28
|
import * as i1 from "./options.service";
|
|
27
29
|
import * as i2 from "./dialog.service";
|
|
@@ -56,7 +58,56 @@ export class PendingReasonService {
|
|
|
56
58
|
this.purchasePortalLine = [];
|
|
57
59
|
this.docDeliveryBatch = new DocDeliveryBatch();
|
|
58
60
|
this.articleAmount = 0;
|
|
61
|
+
this.warehouseLocationPopupShown = false;
|
|
59
62
|
this._relation = new Relation();
|
|
63
|
+
this._purchaseOrdersCompleted = false;
|
|
64
|
+
this._receiveGoodsCompleted = false;
|
|
65
|
+
this._allocateGoodsCompleted = false;
|
|
66
|
+
this._purchaseOrderConfirmationCompleted = false;
|
|
67
|
+
this._deliveryCompleted = false;
|
|
68
|
+
this._invoiceCompleted = false;
|
|
69
|
+
}
|
|
70
|
+
set purchaseOrdersCompleted(value) {
|
|
71
|
+
this._purchaseOrdersCompleted = value;
|
|
72
|
+
this.transactionEventService.salesOrderGeneratePurchaseOrdersCompletedChanged.next(this._purchaseOrdersCompleted);
|
|
73
|
+
}
|
|
74
|
+
get purchaseOrdersCompleted() {
|
|
75
|
+
return this._purchaseOrdersCompleted;
|
|
76
|
+
}
|
|
77
|
+
set receiveGoodsCompleted(value) {
|
|
78
|
+
this._receiveGoodsCompleted = value;
|
|
79
|
+
this.transactionEventService.purchaseOrderReceiveGoodsCompletedChanged.next(this._receiveGoodsCompleted);
|
|
80
|
+
}
|
|
81
|
+
get receiveGoodsCompleted() {
|
|
82
|
+
return this._receiveGoodsCompleted;
|
|
83
|
+
}
|
|
84
|
+
set allocateGoodsCompleted(value) {
|
|
85
|
+
this._allocateGoodsCompleted = value;
|
|
86
|
+
this.transactionEventService.purchaseOrderAllocateGoodsCompletedChanged.next(this._allocateGoodsCompleted);
|
|
87
|
+
}
|
|
88
|
+
get allocateGoodsCompleted() {
|
|
89
|
+
return this._allocateGoodsCompleted;
|
|
90
|
+
}
|
|
91
|
+
set purchaseOrderConfirmationCompleted(value) {
|
|
92
|
+
this._purchaseOrderConfirmationCompleted = value;
|
|
93
|
+
this.transactionEventService.purchaseOrderConfirmationCompletedChanged.next(this._purchaseOrderConfirmationCompleted);
|
|
94
|
+
}
|
|
95
|
+
get purchaseOrderConfirmationCompleted() {
|
|
96
|
+
return this._purchaseOrderConfirmationCompleted;
|
|
97
|
+
}
|
|
98
|
+
set deliveryCompleted(value) {
|
|
99
|
+
this._deliveryCompleted = value;
|
|
100
|
+
this.transactionEventService.salesOrderDeliveryCompletedChanged.next(this._deliveryCompleted);
|
|
101
|
+
}
|
|
102
|
+
get deliveryCompleted() {
|
|
103
|
+
return this._deliveryCompleted;
|
|
104
|
+
}
|
|
105
|
+
set invoiceCompleted(value) {
|
|
106
|
+
this._invoiceCompleted = value;
|
|
107
|
+
this.transactionEventService.salesOrderInvoiceCompletedChanged.next(this._invoiceCompleted);
|
|
108
|
+
}
|
|
109
|
+
get invoiceCompleted() {
|
|
110
|
+
return this._invoiceCompleted;
|
|
60
111
|
}
|
|
61
112
|
set relation(value) {
|
|
62
113
|
if (value) {
|
|
@@ -96,6 +147,7 @@ export class PendingReasonService {
|
|
|
96
147
|
if (transactionInfoResponse.isSuccess) {
|
|
97
148
|
this.rememberCurrentTransaction(transactionInfoResponse);
|
|
98
149
|
}
|
|
150
|
+
this.warehouseLocationPopupShown = false;
|
|
99
151
|
});
|
|
100
152
|
}
|
|
101
153
|
cancelAddTransactionLine(lineUuid, remember = true) {
|
|
@@ -157,6 +209,11 @@ export class PendingReasonService {
|
|
|
157
209
|
// }
|
|
158
210
|
this.currentTransaction = value;
|
|
159
211
|
this._setAmount();
|
|
212
|
+
this._checkPurchaseOrders();
|
|
213
|
+
this._checkReceivedGoods();
|
|
214
|
+
this._checkGoodsAllocation();
|
|
215
|
+
this._checkPurchaseOrderConfirmation();
|
|
216
|
+
this._checkDelivery();
|
|
160
217
|
if (this.currentTransaction.transactionInfo.relation && this.currentTransaction.transactionInfo.relation.relationId && !this.relation.relationId) {
|
|
161
218
|
this._getRelation(this.currentTransaction.transactionInfo.relation);
|
|
162
219
|
}
|
|
@@ -167,6 +224,9 @@ export class PendingReasonService {
|
|
|
167
224
|
return __awaiter(this, void 0, void 0, function* () {
|
|
168
225
|
// we can safely save/commit the changes
|
|
169
226
|
const response = yield this.saveTransaction();
|
|
227
|
+
if (response && response.isSuccess) {
|
|
228
|
+
this.rememberCurrentTransaction(response);
|
|
229
|
+
}
|
|
170
230
|
// we need to do an extra commit to release the lock
|
|
171
231
|
const commitSuccess = yield this.commit();
|
|
172
232
|
return response && response.isSuccess && commitSuccess;
|
|
@@ -267,6 +327,147 @@ export class PendingReasonService {
|
|
|
267
327
|
return this.handleHeaderOperationStatuses(response);
|
|
268
328
|
});
|
|
269
329
|
}
|
|
330
|
+
getTransactionInfo(transId, lineId) {
|
|
331
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
332
|
+
return yield this.connector.getTransactionInfo(transId, lineId);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
getGoodsReceiptStatus(transId, lineNr) {
|
|
336
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
337
|
+
return yield this.connector.getGoodsReceiptStatus(transId, lineNr);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
getDeliveryOrderStatus(transId, lineId) {
|
|
341
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
342
|
+
return yield this.connector.getDeliveryOrderStatus(transId, lineId);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
getGoodsAllocationStatus(transId, lineNr) {
|
|
346
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
347
|
+
return yield this.connector.getGoodsAllocationStatus(transId, lineNr);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
getPurchasePortalLines(request) {
|
|
351
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
352
|
+
return yield this.connector.getPurchasePortalLines(request);
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
_checkPurchaseOrders() {
|
|
356
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
357
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.SalesOrder && this.currentTransaction.transactionLines) {
|
|
358
|
+
const promises = [];
|
|
359
|
+
const amountTransLineCommCodeZero = this.currentTransaction.transactionLines.filter(l => l.commissionCode === "0").length;
|
|
360
|
+
let amountPurchaseOrders = 0;
|
|
361
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
362
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
363
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
364
|
+
const transLine = articleTransLines[i];
|
|
365
|
+
promises.push(this.getTransactionInfo(transId, transLine.lineNr).then((transactions) => {
|
|
366
|
+
if (transactions && transactions.length > 0) {
|
|
367
|
+
transLine.purchaseOrderId = transactions[0].transId;
|
|
368
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
369
|
+
amountPurchaseOrders++;
|
|
370
|
+
}
|
|
371
|
+
}));
|
|
372
|
+
}
|
|
373
|
+
Promise.all(promises).then(() => {
|
|
374
|
+
this.purchaseOrdersCompleted = this.currentTransaction.transactionLines.length > 0 && (amountTransLineCommCodeZero === amountPurchaseOrders);
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
_checkReceivedGoods() {
|
|
380
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
381
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.PurchaseOrder && this.currentTransaction.transactionLines) {
|
|
382
|
+
const promises = [];
|
|
383
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
384
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
385
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
386
|
+
const transLine = articleTransLines[i];
|
|
387
|
+
promises.push(this.getGoodsReceiptStatus(transId, transLine.lineNr).then((goodsReceiptStatus) => {
|
|
388
|
+
transLine.quantityToReceive = goodsReceiptStatus.quantityToReceive;
|
|
389
|
+
transLine.quantityReceived = goodsReceiptStatus.quantityReceived;
|
|
390
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
391
|
+
}));
|
|
392
|
+
}
|
|
393
|
+
Promise.all(promises).then(() => {
|
|
394
|
+
this.receiveGoodsCompleted = this.currentTransaction.transactionLines.find(l => l.quantityToReceive !== 0) === undefined;
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
_checkDelivery() {
|
|
400
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
401
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.SalesOrder && this.currentTransaction.transactionLines) {
|
|
402
|
+
const promises = [];
|
|
403
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
404
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
405
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
406
|
+
const transLine = articleTransLines[i];
|
|
407
|
+
promises.push(this.getDeliveryOrderStatus(transId, transLine.lineNr).then((result) => {
|
|
408
|
+
transLine.quantityToDeliver = result.quantityToDeliver;
|
|
409
|
+
transLine.quantityToInvoice = result.quantityToInvoice;
|
|
410
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
411
|
+
}));
|
|
412
|
+
}
|
|
413
|
+
Promise.all(promises).then(() => {
|
|
414
|
+
this.deliveryCompleted = this.currentTransaction.transactionLines.find(l => l.quantityDelivered !== l.amount) === undefined;
|
|
415
|
+
this.invoiceCompleted = this.currentTransaction.transactionLines.find(l => l.quantityInvoiced !== l.amount) === undefined;
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
_checkGoodsAllocation() {
|
|
421
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
422
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.SalesOrder && this.currentTransaction.transactionLines) {
|
|
423
|
+
const promises = [];
|
|
424
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
425
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
426
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
427
|
+
const transLine = articleTransLines[i];
|
|
428
|
+
promises.push(this.getGoodsAllocationStatus(transId, transLine.lineNr).then((goodsAllocationStatus) => {
|
|
429
|
+
transLine.quantityToAllocate = goodsAllocationStatus.quantityToAllocate;
|
|
430
|
+
transLine.quantityAllocated = goodsAllocationStatus.quantityAllocated;
|
|
431
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
432
|
+
}));
|
|
433
|
+
}
|
|
434
|
+
Promise.all(promises).then(() => {
|
|
435
|
+
this.allocateGoodsCompleted = this.currentTransaction.transactionLines.find(l => /*l.commissionCode === "1" &&*/ l.quantityToAllocate !== 0) === undefined;
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
_checkPurchaseOrderConfirmation() {
|
|
441
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
442
|
+
let completed = true;
|
|
443
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.PurchaseOrder && this.currentTransaction.transactionLines) {
|
|
444
|
+
const promises = [];
|
|
445
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
446
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
447
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
448
|
+
const transLine = articleTransLines[i];
|
|
449
|
+
const purchasePortalFilter = new PurchasePortalFilters();
|
|
450
|
+
const getPurchasePortalLine = new GetPurchasePortalLine();
|
|
451
|
+
purchasePortalFilter.purchaseOrderNo = this.currentTransaction.transactionInfo.transactionNr.toString();
|
|
452
|
+
purchasePortalFilter.lineId = transLine.lineNr.toString();
|
|
453
|
+
getPurchasePortalLine.transIdPurchase = transId;
|
|
454
|
+
getPurchasePortalLine.filterObject = purchasePortalFilter;
|
|
455
|
+
promises.push(this.getPurchasePortalLines(getPurchasePortalLine).then((lines) => {
|
|
456
|
+
if (lines && lines.length > 0) {
|
|
457
|
+
transLine.purchasePortalLine = lines[0];
|
|
458
|
+
if (transLine.purchasePortalLine.amountOrdered !== transLine.purchasePortalLine.amountConfirmed) {
|
|
459
|
+
completed = false;
|
|
460
|
+
}
|
|
461
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
462
|
+
}
|
|
463
|
+
}));
|
|
464
|
+
}
|
|
465
|
+
Promise.all(promises).then(() => {
|
|
466
|
+
this.purchaseOrderConfirmationCompleted = completed;
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
}
|
|
270
471
|
_confirmAction(uuid, reason, type) {
|
|
271
472
|
return __awaiter(this, void 0, void 0, function* () {
|
|
272
473
|
const reasonRequest = new ResolveLinePendingReasonRequest(uuid, reason, type);
|
|
@@ -370,4 +571,4 @@ PendingReasonService.ctorParameters = () => [
|
|
|
370
571
|
{ type: TransactionEventService },
|
|
371
572
|
{ type: RelationService }
|
|
372
573
|
];
|
|
373
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVuZGluZy1yZWFzb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RyYW5zYWN0aW9uL3NyYy9saWIvc2VydmljZS9wZW5kaW5nLXJlYXNvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1FQUFtRSxDQUFDO0FBRTFHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhEQUE4RCxDQUFDO0FBRS9GLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnRUFBZ0UsQ0FBQztBQUNuRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDdkgsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFcEUsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sK0VBQStFLENBQUM7QUFJaEksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNERBQTRELENBQUM7QUFFNUYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDckYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BF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LFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQWtCLEVBQUUsRUFBRTtnQkFDdEYsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxRQUFRLEVBQUU7b0JBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQTRCLEVBQUUsRUFBRTt3QkFDeEcsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7b0JBQzNCLENBQUMsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxZQUFZLENBQUMsUUFBUSxFQUFFO29CQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUE0QixFQUFFLEVBQUU7d0JBQ3hHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO29CQUMzQixDQUFDLENBQUMsQ0FBQztpQkFDSjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs7O1lBbFVGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBOUJPLGNBQWM7WUFJZCxhQUFhO1lBSGIsMkJBQTJCO1lBYzNCLGFBQWE7WUFUYix1QkFBdUI7WUFVdkIsaUJBQWlCO1lBQ2pCLHVCQUF1QjtZQVF2QixlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWluZm8tcmVzcG9uc2UuYm9cIjtcclxuaW1wb3J0IHtMaW5lT3BlcmF0aW9uU3RhdHVzfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2xpbmUtb3BlcmF0aW9uLXN0YXR1cy5ib1wiO1xyXG5pbXBvcnQge1BlbmRpbmdSZWFzb25UeXBlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vcGVuZGluZy1yZWFzb24tdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25MaW5lSW5mb30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1saW5lLWluZm8uYm9cIjtcclxuaW1wb3J0IHtPcHRpb25zU2VydmljZX0gZnJvbSBcIi4vb3B0aW9ucy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25Db25uZWN0b3JTZXJ2aWNlfSBmcm9tIFwiLi90cmFuc2FjdGlvbi1jb25uZWN0b3Iuc2VydmljZVwiO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvbkxpbmVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vdHJhbnNhY3Rpb24tbGluZS10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtEaWFsb2dTZXJ2aWNlfSBmcm9tIFwiLi9kaWFsb2cuc2VydmljZVwiO1xyXG5pbXBvcnQge1Jlc29sdmVMaW5lUGVuZGluZ1JlYXNvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVzb2x2ZS1wZW5kaW5nLXJlYXNvbi1yZXF1ZXN0LmJvXCI7XHJcbmltcG9ydCB7QXJ0aWNsZUNvbm5lY3RvclNlcnZpY2V9IGZyb20gXCIuL2FydGljbGUtY29ubmVjdG9yLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtIZWFkZXJPcGVyYXRpb25TdGF0dXN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvaGVhZGVyLW9wZXJhdGlvbi1zdGF0dXMuYm9cIjtcclxuaW1wb3J0IHtSZXNvbHZlSGVhZGVyUGVuZGluZ1JlYXNvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVzb2x2ZS1oZWFkZXItcGVuZGluZy1yZWFzb24tcmVxdWVzdC5ib1wiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uSW5mb30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1pbmZvLmJvXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25MaW5lQ2hhcmFjdGVyaXN0aWN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb25MaW5lQ2hhcmFjdGVyaXN0aWMuYm9cIjtcclxuaW1wb3J0IHtQdXJjaGFzZVBvcnRhbExpbmV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcHVyY2hhc2UtcG9ydGFsLWxpbmUuYm9cIjtcclxuaW1wb3J0IHtEb2NEZWxpdmVyeUJhdGNofSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2RvYy1kZWxpdmVyeS1iYXRjaC5ib1wiO1xyXG5pbXBvcnQge0RpYWxvZ1Jlc3BvbnNlSW50ZXJmYWNlfSBmcm9tIFwiLi4vaW50ZXJmYWNlL2RpYWxvZy1yZXNwb25zZS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtBcHBQb3B1cEJ1dHRvblR5cGV9IGZyb20gXCIuLi9jb21wb25lbnQvY29yZS9lbnVtL2FwcC1wb3B1cC1idXR0b24tdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7U2hhcmVkU2VydmljZX0gZnJvbSBcIkBjb2xpam5pdC9zaGFyZWRjb21wb25lbnRzXCI7XHJcbmltcG9ydCB7RGljdGlvbmFyeVNlcnZpY2V9IGZyb20gXCIuL2RpY3Rpb25hcnkuc2VydmljZVwiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlfSBmcm9tIFwiLi90cmFuc2FjdGlvbi1ldmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7Q3VzdG9tZXJGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3JlbGF0aW9uYXBpL2J1aWxkL21vZGVsL2N1c3RvbWVyLWZ1bGwtb2JqZWN0LmJvXCI7XHJcbmltcG9ydCB7VmFsaWRhdGlvblJlc3VsdH0gZnJvbSBcIkBjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL3ZhbGlkYXRpb24tcmVzdWx0XCI7XHJcbmltcG9ydCB7UmVsYXRpb25TdGF0dXN9IGZyb20gXCJAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9lbnVtL3JlbGF0aW9uLXN0YXR1cy5lbnVtXCI7XHJcbmltcG9ydCB7UmVsYXRpb25LaW5kfSBmcm9tIFwiQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvZW51bS9yZWxhdGlvbi1raW5kLmVudW1cIjtcclxuaW1wb3J0IHtTdXBwbGllckZ1bGxPYmplY3R9IGZyb20gXCJAY29saWpuaXQvcmVsYXRpb25hcGkvYnVpbGQvbW9kZWwvc3VwcGxpZXItZnVsbC1vYmplY3QuYm9cIjtcclxuaW1wb3J0IHtSZWxhdGlvblNtYWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3JlbGF0aW9uYXBpL2J1aWxkL21vZGVsL3JlbGF0aW9uLXNtYWxsLW9iamVjdC5ib1wiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uS2luZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3RyYW5zYWN0aW9uLWtpbmQuZW51bVwiO1xyXG5pbXBvcnQge1JlbGF0aW9uU2VydmljZX0gZnJvbSBcIi4vcmVsYXRpb24uc2VydmljZVwiO1xyXG5pbXBvcnQge1JlbGF0aW9ufSBmcm9tIFwiQGNvbGlqbml0L3JlbGF0aW9uYXBpL2J1aWxkL21vZGVsL3JlbGF0aW9uLmJvXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCJcclxufSlcclxuZXhwb3J0IGNsYXNzIFBlbmRpbmdSZWFzb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9yZWxhdGlvbkNsYXNzRnJvbVRyYW5zYWN0aW9uS2luZDogTWFwPFRyYW5zYWN0aW9uS2luZCwgdHlwZW9mIFJlbGF0aW9uPiA9IG5ldyBNYXA8VHJhbnNhY3Rpb25LaW5kLCB0eXBlb2YgUmVsYXRpb24+KFtcclxuICAgIFtUcmFuc2FjdGlvbktpbmQuU2FsZXNPcmRlciwgQ3VzdG9tZXJGdWxsT2JqZWN0XSxcclxuICAgIFtUcmFuc2FjdGlvbktpbmQuUHVyY2hhc2VPcmRlciwgU3VwcGxpZXJGdWxsT2JqZWN0XVxyXG4gIF0pO1xyXG5cclxuICBwdWJsaWMgbG9nb3V0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwdWJsaWMgdHJhbnNhY3Rpb25VcGRhdGVkOiBCZWhhdmlvclN1YmplY3Q8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4odW5kZWZpbmVkKTtcclxuICBwdWJsaWMgcmVsYXRpb25VcGRhdGVkOiBCZWhhdmlvclN1YmplY3Q8UmVsYXRpb24+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWxhdGlvbj4odW5kZWZpbmVkKTtcclxuXHJcbiAgcHVibGljIGF1dG9TYXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGFwcGxpY2F0aW9uVXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpbnZvaWNlQWRkcmVzc1NhbWVBc0RlbGl2ZXJ5OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcHVibGljIHRyYW5zYWN0aW9uS2luZDogVHJhbnNhY3Rpb25LaW5kID0gVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXI7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50VHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlID0gbmV3IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKCk7XHJcblxyXG4gIHB1YmxpYyBzZXQgcmVsYXRpb24odmFsdWU6IFJlbGF0aW9uKSB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5fcmVsYXRpb24gPSB2YWx1ZTtcclxuICAgICAgdGhpcy5yZWxhdGlvblVwZGF0ZWQubmV4dCh0aGlzLl9yZWxhdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcmVsYXRpb24oKTogUmVsYXRpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0aW9uO1xyXG4gIH1cclxuICBwdWJsaWMgcHVyY2hhc2VQb3J0YWxMaW5lOiBQdXJjaGFzZVBvcnRhbExpbmVbXSA9IFtdO1xyXG4gIHB1YmxpYyBkb2NEZWxpdmVyeUJhdGNoOiBEb2NEZWxpdmVyeUJhdGNoID0gbmV3IERvY0RlbGl2ZXJ5QmF0Y2goKVxyXG5cclxuICBwdWJsaWMgYXJ0aWNsZUFtb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSBfcmVsYXRpb246IFJlbGF0aW9uID0gbmV3IFJlbGF0aW9uKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgY29ubmVjdG9yOiBUcmFuc2FjdGlvbkNvbm5lY3RvclNlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBhcnRpY2xlQ29ubmVjdG9yOiBBcnRpY2xlQ29ubmVjdG9yU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25FdmVudFNlcnZpY2U6IFRyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHJlbGF0aW9uU2VydmljZTogUmVsYXRpb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdChvcHRpb25zOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5pbml0aWFsaXplKG9wdGlvbnMpO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmluaXQob3B0aW9ucyk7XHJcbiAgICB0aGlzLmNvbm5lY3Rvci5jb25uZWN0KCk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlLmNvbm5lY3Rpb25Jbml0aWFsaXplZC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZU5ld1JlbGF0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2xheno6IHR5cGVvZiBSZWxhdGlvbiA9IHRoaXMuX2dldFJlbGF0aW9uQ2xhc3ModGhpcy50cmFuc2FjdGlvbktpbmQpO1xyXG4gICAgdGhpcy5yZWxhdGlvbiA9IG5ldyBjbGF6ejtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldEN1cnJlbnRUcmFuc2FjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKCk7XHJcbiAgICB0aGlzLl9yZWxhdGlvbiA9IG5ldyBDdXN0b21lckZ1bGxPYmplY3QoKTtcclxuICAgIHRoaXMuYXJ0aWNsZUFtb3VudCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29tbWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNvbW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJvbGxiYWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnJvbGxiYWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb25CeUlkKHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0VHJhbnNhY3Rpb25CeUlkKHRyYW5zYWN0aW9uSWQpO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLmlzU3VjY2Vzcykge1xyXG4gICAgICB0aGlzLnJlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjYW5jZWxBZGRUcmFuc2FjdGlvbkxpbmUobGluZVV1aWQ6IHN0cmluZywgcmVtZW1iZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuY29ubmVjdG9yLmNhbmNlbEFkZFRyYW5zYWN0aW9uTGluZShsaW5lVXVpZClcclxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UuaXNTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaGFuZGxlSGVhZGVyT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBpZiAoIXJlc3BvbnNlLmhlYWRlck9wZXJhdGlvblN0YXR1c2VzIHx8IHJlc3BvbnNlLmhlYWRlck9wZXJhdGlvblN0YXR1c2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgLy8gICByZXR1cm4gdGhpcy5hdXRvU2F2ZSA/IHRoaXMuX3NhdmVUcmFuc2FjdGlvbkFuZENvbW1pdCgpIDogdHJ1ZTtcclxuICAgIC8vIH1cclxuICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByZXNwb25zZS5oZWFkZXJPcGVyYXRpb25TdGF0dXNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzdGF0dXM6IEhlYWRlck9wZXJhdGlvblN0YXR1cyA9IHJlc3BvbnNlLmhlYWRlck9wZXJhdGlvblN0YXR1c2VzW2ldO1xyXG4gICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBhd2FpdCB0aGlzLl9oYW5kbGVIZWFkZXJPcGVyYXRpb25TdGF0dXMoc3RhdHVzLCByZXNwb25zZS50cmFuc2FjdGlvbkluZm8pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGFzUGVuZGluZ1JlYXNvbnM6IGJvb2xlYW4gPSByZXNwb25zZS5oZWFkZXJPcGVyYXRpb25TdGF0dXNlcy5maWx0ZXIobG9zID0+IGxvcy5wZW5kaW5nUmVhc29uICE9PSBcIk5PTkVcIikubGVuZ3RoID4gMDtcclxuICAgIGlmICghaGFzUGVuZGluZ1JlYXNvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZVRyYW5zYWN0aW9uQW5kQ29tbWl0KCk7XHJcbiAgICAgIH0gZWxzZSB7IC8vIGp1c3QgcmVwbGFjZSB0cmFuc2FjdGlvbiBvYmplY3RcclxuICAgICAgICB0aGlzLnJlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2F2ZVRyYW5zYWN0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLnNhdmVUcmFuc2FjdGlvbih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZClcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5pc1N1Y2Nlc3MpIHtcclxuICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiAodmFsdWUgJiYgdmFsdWUudHJhbnNhY3Rpb25MaW5lcykge1xyXG4gICAgLy8gICB2YWx1ZS50cmFuc2FjdGlvbkxpbmVzLnNvcnQoKGEsIGIpID0+IGEubGluZU5yIDwgYi5saW5lTnIgPyAtMSA6IDEpO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMuX3NldEFtb3VudCgpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5yZWxhdGlvbiAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8ucmVsYXRpb24ucmVsYXRpb25JZCAmJiAhdGhpcy5yZWxhdGlvbi5yZWxhdGlvbklkKSB7XHJcbiAgICAgIHRoaXMuX2dldFJlbGF0aW9uKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5yZWxhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50cmFuc2FjdGlvblVwZGF0ZWQubmV4dCh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9zYXZlVHJhbnNhY3Rpb25BbmRDb21taXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyB3ZSBjYW4gc2FmZWx5IHNhdmUvY29tbWl0IHRoZSBjaGFuZ2VzXHJcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNhdmVUcmFuc2FjdGlvbigpO1xyXG4gICAgLy8gd2UgbmVlZCB0byBkbyBhbiBleHRyYSBjb21taXQgdG8gcmVsZWFzZSB0aGUgbG9ja1xyXG4gICAgY29uc3QgY29tbWl0U3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbWl0KCk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UgJiYgcmVzcG9uc2UuaXNTdWNjZXNzICYmIGNvbW1pdFN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbGF0aW9uKSB7XHJcbiAgICAgIHRoaXMucmVsYXRpb24gPSBuZXcgQ3VzdG9tZXJGdWxsT2JqZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucmVsYXRpb24ucmVsYXRpb25JZCkge1xyXG4gICAgICBpZiAodGhpcy5yZWxhdGlvbi5yZWxhdGlvblR5cGUgPT09IFJlbGF0aW9uS2luZC5DdXN0b21lcikge1xyXG4gICAgICAgICh0aGlzLnJlbGF0aW9uIGFzIEN1c3RvbWVyRnVsbE9iamVjdCkucmVsYXRpb25TdGF0dXMgPSBSZWxhdGlvblN0YXR1cy5SZWd1bGFyQ3VzdG9tZXI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWxhdGlvbi5zdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5wcmVmZXJyZWREZWxpdmVyeURhdGUyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnByZWZlcnJlZERlbGl2ZXJ5RGF0ZTIgPSBcIj1cIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBpZiAoIXJlc3BvbnNlLmxpbmVPcGVyYXRpb25TdGF0dXNlcyB8fCByZXNwb25zZS5saW5lT3BlcmF0aW9uU3RhdHVzZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAvLyAgIHJldHVybiB0aGlzLmF1dG9TYXZlID8gdGhpcy5fc2F2ZVRyYW5zYWN0aW9uQW5kQ29tbWl0KCkgOiB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJlc3BvbnNlLmxpbmVPcGVyYXRpb25TdGF0dXNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzdGF0dXM6IExpbmVPcGVyYXRpb25TdGF0dXMgPSByZXNwb25zZS5saW5lT3BlcmF0aW9uU3RhdHVzZXNbaV07XHJcbiAgICAgIGNvbnN0IHRyYW5zTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbyA9IHJlc3BvbnNlLnRyYW5zYWN0aW9uTGluZXMuZmluZCh0ID0+IHQubGluZU5yID09PSBzdGF0dXMubGluZU5yKTtcclxuICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgYXdhaXQgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cyhzdGF0dXMsIHRyYW5zTGluZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBoYXNQZW5kaW5nUmVhc29uczogYm9vbGVhbiA9IHJlc3BvbnNlLmxpbmVPcGVyYXRpb25TdGF0dXNlcy5maWx0ZXIobG9zID0+IGxvcy5wZW5kaW5nUmVhc29uICE9PSBcIk5PTkVcIikubGVuZ3RoID4gMDtcclxuICAgIGlmICghaGFzUGVuZGluZ1JlYXNvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZVRyYW5zYWN0aW9uQW5kQ29tbWl0KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cyhvcGVyYXRpb25TdGF0dXM6IExpbmVPcGVyYXRpb25TdGF0dXMsIHRyYW5zYWN0aW9uTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgc3dpdGNoIChvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpIHtcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5BQk9SVEVEOlxyXG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLkNBTkNFTExFRDpcclxuICAgICAgICBpZiAob3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24gIT09ICdVU0VSX0RFQ0lTSU9OJykge1xyXG4gICAgICAgIC8vICAgYXdhaXQgdGhpcy5fY2FuY2VsQXJ0aWNsZShvcGVyYXRpb25TdGF0dXMudXVpZCk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3Nob3dSZWFzb25EaWFsb2cob3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQ09ORklSTUFUSU9OX05FRURFRDpcclxuICAgICAgICBhd2FpdCB0aGlzLl9jb25maXJtQWN0aW9uKHRyYW5zYWN0aW9uTGluZS51dWlkLCBvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbiwgb3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb25UeXBlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5JTlZBTElEX0xPR0lTVElDUzpcclxuICAgICAgICBhd2FpdCB0aGlzLl9zaG93V2FyZWhvdXNlQ2NEaWFsb2coXHJcbiAgICAgICAgICBvcGVyYXRpb25TdGF0dXMudXVpZCwgdHJhbnNhY3Rpb25MaW5lLmFtb3VudCwgdHJhbnNhY3Rpb25MaW5lLmNvbW1pc3Npb25Db2RlLCB0cmFuc2FjdGlvbkxpbmUud2FyZWhvdXNlTnVtYmVyLFxyXG4gICAgICAgICAgb3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24sIG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuTk9OX0NSSVRJQ0FMX0RJU0NPTlRJTlVBVElPTjpcclxuICAgICAgICB0aGlzLl9zaG93UmVhc29uRGlhbG9nKG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5DSEFSQUNURVJJU1RJQ1NfQU5TV0VSX05FRURFRDpcclxuICAgICAgICB0aGlzLl9zaG93Q2hhcmFjdGVyaXN0aWNEaWFsb2cob3BlcmF0aW9uU3RhdHVzLnV1aWQsIG9wZXJhdGlvblN0YXR1cy5jaGFyYWN0ZXJpc3RpYywgb3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24sIG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuTk9ORTpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUhlYWRlck9wZXJhdGlvblN0YXR1cyhvcGVyYXRpb25TdGF0dXM6IEhlYWRlck9wZXJhdGlvblN0YXR1cywgdHJhbnNhY3Rpb25JbmZvOiBUcmFuc2FjdGlvbkluZm8pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHN3aXRjaCAob3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb25UeXBlKSB7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQUJPUlRFRDpcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5DQU5DRUxMRUQ6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc2hvd1JlYXNvbkRpYWxvZyhvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLkNPTkZJUk1BVElPTl9ORUVERUQ6XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpcm1IZWFkZXJBY3Rpb24odHJhbnNhY3Rpb25JbmZvLnV1aWQsIG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uLCBvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpO1xyXG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLk5PTkU6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHBlbmRpbmdMaW5lVmFsdWVzOiBSZXNvbHZlTGluZVBlbmRpbmdSZWFzb25SZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24ocGVuZGluZ0xpbmVWYWx1ZXMpO1xyXG4gICAgLy8gdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICB0aGlzLmhhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXNlcyhyZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZVBlbmRpbmdIZWFkZXJSZWFzb24ocGVuZGluZ0hlYWRlclZhbHVlczogUmVzb2x2ZUhlYWRlclBlbmRpbmdSZWFzb25SZXF1ZXN0KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5yZXNvbHZlUGVuZGluZ0hlYWRlclJlYXNvbihwZW5kaW5nSGVhZGVyVmFsdWVzKTtcclxuICAgIC8vIHRoaXMucmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlSGVhZGVyT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY29uZmlybUFjdGlvbih1dWlkOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCB0eXBlOiBQZW5kaW5nUmVhc29uVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcmVhc29uUmVxdWVzdCA9IG5ldyBSZXNvbHZlTGluZVBlbmRpbmdSZWFzb25SZXF1ZXN0KHV1aWQsIHJlYXNvbiwgdHlwZSk7XHJcbiAgICAvLyBjb25zdCBwZW5kaW5nUmVhc29uVGV4dDogc3RyaW5nID0gYXdhaXQgdGhpcy5fZ2V0UGVuZGluZ1JlYXNvblRleHQodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24pO1xyXG4gICAgcmVhc29uUmVxdWVzdC5jb25maXJtYXRpb24gPSBhd2FpdCB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd1llc05vKCdBY3Rpb24nLCByZWFzb24pO1xyXG4gICAgYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24ocmVhc29uUmVxdWVzdCk7XHJcbiAgICAvLyB0aGlzLl9oYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3Nob3dDaGFyYWN0ZXJpc3RpY0RpYWxvZyh1dWlkOiBzdHJpbmcsIGNoYXJhY3RlcmlzdGljczogVHJhbnNhY3Rpb25MaW5lQ2hhcmFjdGVyaXN0aWMsIHJlYXNvbjogc3RyaW5nLCB0eXBlOiBQZW5kaW5nUmVhc29uVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcmVhc29uUmVxdWVzdCA9IG5ldyBSZXNvbHZlTGluZVBlbmRpbmdSZWFzb25SZXF1ZXN0KHV1aWQsIHJlYXNvbiwgdHlwZSk7XHJcbiAgICBsZXQgY2hhcjogc3RyaW5nO1xyXG4gICAgY29uc3QgcmVzcG9uc2U6IERpYWxvZ1Jlc3BvbnNlSW50ZXJmYWNlID0gYXdhaXQgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dDaGFyYWN0ZXJpc3RpY3MoXHJcbiAgICAgIGNoYXJhY3RlcmlzdGljcy5xdWVzdGlvbiwgY2hhcmFjdGVyaXN0aWNzLnRyYW5zYWN0aW9uTGluZUNoYXJhY3RlcmlzdGljQ2hvaWNlcywgY2hhcmFjdGVyaXN0aWNzLnZhbHVlKTtcclxuICAgIGlmIChyZXNwb25zZS5idXR0b24gPT09IEFwcFBvcHVwQnV0dG9uVHlwZS5Paykge1xyXG4gICAgICBjaGFyID0gcmVzcG9uc2Uub3V0cHV0O1xyXG4gICAgfVxyXG4gICAgcmVhc29uUmVxdWVzdC50ZXh0dWFsVXNlcklucHV0ID0gY2hhcjtcclxuICAgIGF3YWl0IHRoaXMucmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHJlYXNvblJlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfc2hvd1dhcmVob3VzZUNjRGlhbG9nKHV1aWQ6IHN0cmluZywgcXVhbnRpdHk6IG51bWJlciwgY29tbWlzc2lvbkNvZGU6IHN0cmluZywgd2FyZWhvdXNlTnI6IG51bWJlciwgcmVhc29uOiBzdHJpbmcsIHR5cGU6IFBlbmRpbmdSZWFzb25UeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCByZWFzb25SZXF1ZXN0ID0gbmV3IFJlc29sdmVMaW5lUGVuZGluZ1JlYXNvblJlcXVlc3QodXVpZCwgcmVhc29uLCB0eXBlKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEaWFsb2dSZXNwb25zZUludGVyZmFjZSA9IGF3YWl0IHRoaXMuZGlhbG9nU2VydmljZS5zaG93V2FyZWhvdXNlQ0MocXVhbnRpdHksIGNvbW1pc3Npb25Db2RlLCB3YXJlaG91c2VOcik7XHJcbiAgICBpZiAocmVzcG9uc2UuYnV0dG9uID09PSBBcHBQb3B1cEJ1dHRvblR5cGUuT2spIHtcclxuICAgICAgcmVhc29uUmVxdWVzdC5xdWFudGl0eSA9IHJlc3BvbnNlLm91dHB1dC5xdWFudGl0eTtcclxuICAgICAgcmVhc29uUmVxdWVzdC5jb21taXNzaW9uQ29kZSA9IHJlc3BvbnNlLm91dHB1dC5jb21taXNzaW9uQ29kZTtcclxuICAgICAgcmVhc29uUmVxdWVzdC53YXJlaG91c2VOciA9IHJlc3BvbnNlLm91dHB1dC53YXJlaG91c2VOcjtcclxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24ocmVhc29uUmVxdWVzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9jYW5jZWxBcnRpY2xlKHV1aWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY29uZmlybUhlYWRlckFjdGlvbih1dWlkOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCB0eXBlOiBQZW5kaW5nUmVhc29uVHlwZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcmVhc29uUmVxdWVzdCA9IG5ldyBSZXNvbHZlSGVhZGVyUGVuZGluZ1JlYXNvblJlcXVlc3QodXVpZCwgcmVhc29uLCB0eXBlKTtcclxuICAgIC8vIGNvbnN0IHBlbmRpbmdSZWFzb25UZXh0OiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9nZXRQZW5kaW5nUmVhc29uVGV4dCh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbik7XHJcbiAgICByZWFzb25SZXF1ZXN0LmNvbmZpcm1hdGlvbiA9IGF3YWl0IHRoaXMuZGlhbG9nU2VydmljZS5zaG93WWVzTm8oJ0FjdGlvbicsIHJlYXNvbik7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0hlYWRlclJlYXNvbihyZWFzb25SZXF1ZXN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3Nob3dSZWFzb25EaWFsb2cocmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0luZm9ybWF0aW9uKHJlYXNvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRBbW91bnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcykge1xyXG4gICAgICB0aGlzLmFydGljbGVBbW91bnQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzLmZpbHRlcih0ID0+IHQubGluZVR5cGUgPT09IFRyYW5zYWN0aW9uTGluZVR5cGUuQXJ0aWNsZUxpbmUpLmxlbmd0aDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2NhbmNlbEFydGljbGUodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNhbmNlbEFkZFRyYW5zYWN0aW9uTGluZSh1dWlkLCBmYWxzZSlcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UmVsYXRpb25DbGFzcyh0cmFuc2FjdGlvbktpbmQ6IFRyYW5zYWN0aW9uS2luZCk6IHR5cGVvZiBSZWxhdGlvbiB7XHJcbiAgICBpZiAodGhpcy5fcmVsYXRpb25DbGFzc0Zyb21UcmFuc2FjdGlvbktpbmQuaGFzKHRyYW5zYWN0aW9uS2luZCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3JlbGF0aW9uQ2xhc3NGcm9tVHJhbnNhY3Rpb25LaW5kLmdldCh0cmFuc2FjdGlvbktpbmQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFJlbGF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UmVsYXRpb24ocmVsYXRpb246IFJlbGF0aW9uU21hbGxPYmplY3QpOiB2b2lkIHtcclxuICAgIGlmIChyZWxhdGlvbikge1xyXG4gICAgICB0aGlzLnJlbGF0aW9uU2VydmljZS5nZXRSZWxhdGlvbk51bWJlcihyZWxhdGlvbi5yZWxhdGlvbklkKS50aGVuKChyZWxhdGlvbk5yOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAocmVsYXRpb24ucmVsYXRpb25UeXBlID09PSBSZWxhdGlvbktpbmQuQ3VzdG9tZXIpIHtcclxuICAgICAgICAgIHRoaXMucmVsYXRpb25TZXJ2aWNlLmdldEN1c3RvbWVyRnVsbE9iamVjdChwYXJzZUludChyZWxhdGlvbk5yLCAwKSkudGhlbigoY3VzdG9tZXI6IEN1c3RvbWVyRnVsbE9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbGF0aW9uID0gY3VzdG9tZXI7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLnJlbGF0aW9uVHlwZSA9PT0gUmVsYXRpb25LaW5kLlN1cHBsaWVyKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbGF0aW9uU2VydmljZS5nZXRTdXBwbGllckZ1bGxPYmplY3QocGFyc2VJbnQocmVsYXRpb25OciwgMCkpLnRoZW4oKHN1cHBsaWVyOiBTdXBwbGllckZ1bGxPYmplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWxhdGlvbiA9IHN1cHBsaWVyO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
574
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVuZGluZy1yZWFzb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RyYW5zYWN0aW9uL3NyYy9saWIvc2VydmljZS9wZW5kaW5nLXJlYXNvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1FQUFtRSxDQUFDO0FBRTFHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhEQUE4RCxDQUFDO0FBRS9GLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnRUFBZ0UsQ0FBQztBQUNuRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDdkgsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFcEUsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sK0VBQStFLENBQUM7QUFJaEksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNERBQTRELENBQUM7QUFFNUYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDckYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BF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QUlkLGFBQWE7WUFIYiwyQkFBMkI7WUFjM0IsYUFBYTtZQVRiLHVCQUF1QjtZQVV2QixpQkFBaUI7WUFDakIsdUJBQXVCO1lBUXZCLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2V9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24taW5mby1yZXNwb25zZS5ib1wiO1xyXG5pbXBvcnQge0xpbmVPcGVyYXRpb25TdGF0dXN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvbGluZS1vcGVyYXRpb24tc3RhdHVzLmJvXCI7XHJcbmltcG9ydCB7UGVuZGluZ1JlYXNvblR5cGV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS9wZW5kaW5nLXJlYXNvbi10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvbkxpbmVJbmZvfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWxpbmUtaW5mby5ib1wiO1xyXG5pbXBvcnQge09wdGlvbnNTZXJ2aWNlfSBmcm9tIFwiLi9vcHRpb25zLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvbkNvbm5lY3RvclNlcnZpY2V9IGZyb20gXCIuL3RyYW5zYWN0aW9uLWNvbm5lY3Rvci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uTGluZVR5cGV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS90cmFuc2FjdGlvbi1saW5lLXR5cGUuZW51bVwiO1xyXG5pbXBvcnQge0RpYWxvZ1NlcnZpY2V9IGZyb20gXCIuL2RpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7UmVzb2x2ZUxpbmVQZW5kaW5nUmVhc29uUmVxdWVzdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9yZXNvbHZlLXBlbmRpbmctcmVhc29uLXJlcXVlc3QuYm9cIjtcclxuaW1wb3J0IHtBcnRpY2xlQ29ubmVjdG9yU2VydmljZX0gZnJvbSBcIi4vYXJ0aWNsZS1jb25uZWN0b3Iuc2VydmljZVwiO1xyXG5pbXBvcnQge0hlYWRlck9wZXJhdGlvblN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9oZWFkZXItb3BlcmF0aW9uLXN0YXR1cy5ib1wiO1xyXG5pbXBvcnQge1Jlc29sdmVIZWFkZXJQZW5kaW5nUmVhc29uUmVxdWVzdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9yZXNvbHZlLWhlYWRlci1wZW5kaW5nLXJlYXNvbi1yZXF1ZXN0LmJvXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25JbmZvfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWluZm8uYm9cIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvbkxpbmVDaGFyYWN0ZXJpc3RpY30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbkxpbmVDaGFyYWN0ZXJpc3RpYy5ib1wiO1xyXG5pbXBvcnQge1B1cmNoYXNlUG9ydGFsTGluZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wdXJjaGFzZS1wb3J0YWwtbGluZS5ib1wiO1xyXG5pbXBvcnQge0RvY0RlbGl2ZXJ5QmF0Y2h9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZG9jLWRlbGl2ZXJ5LWJhdGNoLmJvXCI7XHJcbmltcG9ydCB7RGlhbG9nUmVzcG9uc2VJbnRlcmZhY2V9IGZyb20gXCIuLi9pbnRlcmZhY2UvZGlhbG9nLXJlc3BvbnNlLmludGVyZmFjZVwiO1xyXG5pbXBvcnQge0FwcFBvcHVwQnV0dG9uVHlwZX0gZnJvbSBcIi4uL2NvbXBvbmVudC9jb3JlL2VudW0vYXBwLXBvcHVwLWJ1dHRvbi10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtTaGFyZWRTZXJ2aWNlfSBmcm9tIFwiQGNvbGlqbml0L3NoYXJlZGNvbXBvbmVudHNcIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSBcIi4vZGljdGlvbmFyeS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25FdmVudFNlcnZpY2V9IGZyb20gXCIuL3RyYW5zYWN0aW9uLWV2ZW50LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtDdXN0b21lckZ1bGxPYmplY3R9IGZyb20gXCJAY29saWpuaXQvcmVsYXRpb25hcGkvYnVpbGQvbW9kZWwvY3VzdG9tZXItZnVsbC1vYmplY3QuYm9cIjtcclxuaW1wb3J0IHtWYWxpZGF0aW9uUmVzdWx0fSBmcm9tIFwiQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvdmFsaWRhdGlvbi1yZXN1bHRcIjtcclxuaW1wb3J0IHtSZWxhdGlvblN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC9hcnRpY2xlYXBpL2J1aWxkL2VudW0vcmVsYXRpb24tc3RhdHVzLmVudW1cIjtcclxuaW1wb3J0IHtSZWxhdGlvbktpbmR9IGZyb20gXCJAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9lbnVtL3JlbGF0aW9uLWtpbmQuZW51bVwiO1xyXG5pbXBvcnQge1N1cHBsaWVyRnVsbE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC9yZWxhdGlvbmFwaS9idWlsZC9tb2RlbC9zdXBwbGllci1mdWxsLW9iamVjdC5ib1wiO1xyXG5pbXBvcnQge1JlbGF0aW9uU21hbGxPYmplY3R9IGZyb20gXCJAY29saWpuaXQvcmVsYXRpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tc21hbGwtb2JqZWN0LmJvXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25LaW5kfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vdHJhbnNhY3Rpb24ta2luZC5lbnVtXCI7XHJcbmltcG9ydCB7UmVsYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi9yZWxhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7UmVsYXRpb259IGZyb20gXCJAY29saWpuaXQvcmVsYXRpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24uYm9cIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvbkluZm9IaXN0b3J5fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWluZm8taGlzdG9yeS5ib1wiO1xyXG5pbXBvcnQge0dvb2RzUmVjZWlwdFN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9nb29kcy1yZWNlaXB0LXN0YXR1cy5ib1wiO1xyXG5pbXBvcnQge0dvb2RzUmVjZWlwdFN0YXR1c1dpdGhIaXN0b3J5fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2dvb2RzLXJlY2VpcHQtc3RhdHVzLXdpdGgtaGlzdG9yeS5ib1wiO1xyXG5pbXBvcnQge0RlbGl2ZXJ5T3JkZXJTdGF0dXN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZGVsaXZlcnktb3JkZXItc3RhdHVzLmJvXCI7XHJcbmltcG9ydCB7R29vZHNBbGxvY2F0aW9uU3RhdHVzfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2dvb2RzLWFsbG9jYXRpb24tc3RhdHVzLmJvXCI7XHJcbmltcG9ydCB7R2V0UHVyY2hhc2VQb3J0YWxMaW5lfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2dldC1wdXJjaGFzZS1wb3J0YWwtbGluZVwiO1xyXG5pbXBvcnQge1B1cmNoYXNlUG9ydGFsRmlsdGVyc30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wdXJjaGFzZS1wb3J0YWwtZmlsdGVycy5ib1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZW5kaW5nUmVhc29uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVsYXRpb25DbGFzc0Zyb21UcmFuc2FjdGlvbktpbmQ6IE1hcDxUcmFuc2FjdGlvbktpbmQsIHR5cGVvZiBSZWxhdGlvbj4gPSBuZXcgTWFwPFRyYW5zYWN0aW9uS2luZCwgdHlwZW9mIFJlbGF0aW9uPihbXHJcbiAgICBbVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXIsIEN1c3RvbWVyRnVsbE9iamVjdF0sXHJcbiAgICBbVHJhbnNhY3Rpb25LaW5kLlB1cmNoYXNlT3JkZXIsIFN1cHBsaWVyRnVsbE9iamVjdF1cclxuICBdKTtcclxuXHJcbiAgcHVibGljIGxvZ291dDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHVibGljIHRyYW5zYWN0aW9uVXBkYXRlZDogQmVoYXZpb3JTdWJqZWN0PFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+KHVuZGVmaW5lZCk7XHJcbiAgcHVibGljIHJlbGF0aW9uVXBkYXRlZDogQmVoYXZpb3JTdWJqZWN0PFJlbGF0aW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVsYXRpb24+KHVuZGVmaW5lZCk7XHJcblxyXG4gIHB1YmxpYyBhdXRvU2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBhcHBsaWNhdGlvblVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaW52b2ljZUFkZHJlc3NTYW1lQXNEZWxpdmVyeTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHB1YmxpYyB0cmFuc2FjdGlvbktpbmQ6IFRyYW5zYWN0aW9uS2luZCA9IFRyYW5zYWN0aW9uS2luZC5TYWxlc09yZGVyO1xyXG5cclxuICBwdWJsaWMgY3VycmVudFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IG5ldyBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSgpO1xyXG5cclxuICBwdWJsaWMgc2V0IHB1cmNoYXNlT3JkZXJzQ29tcGxldGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9wdXJjaGFzZU9yZGVyc0NvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5zYWxlc09yZGVyR2VuZXJhdGVQdXJjaGFzZU9yZGVyc0NvbXBsZXRlZENoYW5nZWQubmV4dCh0aGlzLl9wdXJjaGFzZU9yZGVyc0NvbXBsZXRlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHB1cmNoYXNlT3JkZXJzQ29tcGxldGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3B1cmNoYXNlT3JkZXJzQ29tcGxldGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCByZWNlaXZlR29vZHNDb21wbGV0ZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3JlY2VpdmVHb29kc0NvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5wdXJjaGFzZU9yZGVyUmVjZWl2ZUdvb2RzQ29tcGxldGVkQ2hhbmdlZC5uZXh0KHRoaXMuX3JlY2VpdmVHb29kc0NvbXBsZXRlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHJlY2VpdmVHb29kc0NvbXBsZXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNlaXZlR29vZHNDb21wbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGFsbG9jYXRlR29vZHNDb21wbGV0ZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FsbG9jYXRlR29vZHNDb21wbGV0ZWQgPSB2YWx1ZTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25FdmVudFNlcnZpY2UucHVyY2hhc2VPcmRlckFsbG9jYXRlR29vZHNDb21wbGV0ZWRDaGFuZ2VkLm5leHQodGhpcy5fYWxsb2NhdGVHb29kc0NvbXBsZXRlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFsbG9jYXRlR29vZHNDb21wbGV0ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb2NhdGVHb29kc0NvbXBsZXRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcHVyY2hhc2VPcmRlckNvbmZpcm1hdGlvbkNvbXBsZXRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcHVyY2hhc2VPcmRlckNvbmZpcm1hdGlvbkNvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5wdXJjaGFzZU9yZGVyQ29uZmlybWF0aW9uQ29tcGxldGVkQ2hhbmdlZC5uZXh0KHRoaXMuX3B1cmNoYXNlT3JkZXJDb25maXJtYXRpb25Db21wbGV0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBwdXJjaGFzZU9yZGVyQ29uZmlybWF0aW9uQ29tcGxldGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3B1cmNoYXNlT3JkZXJDb25maXJtYXRpb25Db21wbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRlbGl2ZXJ5Q29tcGxldGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kZWxpdmVyeUNvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5zYWxlc09yZGVyRGVsaXZlcnlDb21wbGV0ZWRDaGFuZ2VkLm5leHQodGhpcy5fZGVsaXZlcnlDb21wbGV0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZWxpdmVyeUNvbXBsZXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWxpdmVyeUNvbXBsZXRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaW52b2ljZUNvbXBsZXRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faW52b2ljZUNvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5zYWxlc09yZGVySW52b2ljZUNvbXBsZXRlZENoYW5nZWQubmV4dCh0aGlzLl9pbnZvaWNlQ29tcGxldGVkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaW52b2ljZUNvbXBsZXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnZvaWNlQ29tcGxldGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCByZWxhdGlvbih2YWx1ZTogUmVsYXRpb24pIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLl9yZWxhdGlvbiA9IHZhbHVlO1xyXG4gICAgICB0aGlzLnJlbGF0aW9uVXBkYXRlZC5uZXh0KHRoaXMuX3JlbGF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCByZWxhdGlvbigpOiBSZWxhdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpb247XHJcbiAgfVxyXG4gIHB1YmxpYyBwdXJjaGFzZVBvcnRhbExpbmU6IFB1cmNoYXNlUG9ydGFsTGluZVtdID0gW107XHJcbiAgcHVibGljIGRvY0RlbGl2ZXJ5QmF0Y2g6IERvY0RlbGl2ZXJ5QmF0Y2ggPSBuZXcgRG9jRGVsaXZlcnlCYXRjaCgpXHJcblxyXG4gIHB1YmxpYyBhcnRpY2xlQW1vdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICBwcm90ZWN0ZWQgd2FyZWhvdXNlTG9jYXRpb25Qb3B1cFNob3duOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3JlbGF0aW9uOiBSZWxhdGlvbiA9IG5ldyBSZWxhdGlvbigpO1xyXG4gIHByaXZhdGUgX3B1cmNoYXNlT3JkZXJzQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcmVjZWl2ZUdvb2RzQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfYWxsb2NhdGVHb29kc0NvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3B1cmNoYXNlT3JkZXJDb25maXJtYXRpb25Db21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kZWxpdmVyeUNvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2ludm9pY2VDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgb3B0aW9uczogT3B0aW9uc1NlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBjb25uZWN0b3I6IFRyYW5zYWN0aW9uQ29ubmVjdG9yU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGFydGljbGVDb25uZWN0b3I6IEFydGljbGVDb25uZWN0b3JTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGRpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgIHByb3RlY3RlZCB0cmFuc2FjdGlvbkV2ZW50U2VydmljZTogVHJhbnNhY3Rpb25FdmVudFNlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgcmVsYXRpb25TZXJ2aWNlOiBSZWxhdGlvblNlcnZpY2VcclxuICApIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0KG9wdGlvbnM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmluaXRpYWxpemUob3B0aW9ucyk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaW5pdChvcHRpb25zKTtcclxuICAgIHRoaXMuY29ubmVjdG9yLmNvbm5lY3QoKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25FdmVudFNlcnZpY2UuY29ubmVjdGlvbkluaXRpYWxpemVkLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlTmV3UmVsYXRpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCBjbGF6ejogdHlwZW9mIFJlbGF0aW9uID0gdGhpcy5fZ2V0UmVsYXRpb25DbGFzcyh0aGlzLnRyYW5zYWN0aW9uS2luZCk7XHJcbiAgICB0aGlzLnJlbGF0aW9uID0gbmV3IGNsYXp6O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0Q3VycmVudFRyYW5zYWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UoKTtcclxuICAgIHRoaXMuX3JlbGF0aW9uID0gbmV3IEN1c3RvbWVyRnVsbE9iamVjdCgpO1xyXG4gICAgdGhpcy5hcnRpY2xlQW1vdW50ID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb21taXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY29tbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm9sbGJhY2soKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3Iucm9sbGJhY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkJ5SWQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbkluZm9SZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkJ5SWQodHJhbnNhY3Rpb25JZCk7XHJcbiAgICBpZiAodHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UuaXNTdWNjZXNzKSB7XHJcbiAgICAgIHRoaXMucmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy53YXJlaG91c2VMb2NhdGlvblBvcHVwU2hvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjYW5jZWxBZGRUcmFuc2FjdGlvbkxpbmUobGluZVV1aWQ6IHN0cmluZywgcmVtZW1iZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuY29ubmVjdG9yLmNhbmNlbEFkZFRyYW5zYWN0aW9uTGluZShsaW5lVXVpZClcclxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UuaXNTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaGFuZGxlSGVhZGVyT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBpZiAoIXJlc3BvbnNlLmhlYWRlck9wZXJhdGlvblN0YXR1c2VzIHx8IHJlc3BvbnNlLmhlYWRlck9wZXJhdGlvblN0YXR1c2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgLy8gICByZXR1cm4gdGhpcy5hdXRvU2F2ZSA/IHRoaXMuX3NhdmVUcmFuc2FjdGlvbkFuZENvbW1pdCgpIDogdHJ1ZTtcclxuICAgIC8vIH1cclxuICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByZXNwb25zZS5oZWFkZXJPcGVyYXRpb25TdGF0dXNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzdGF0dXM6IEhlYWRlck9wZXJhdGlvblN0YXR1cyA9IHJlc3BvbnNlLmhlYWRlck9wZXJhdGlvblN0YXR1c2VzW2ldO1xyXG4gICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBhd2FpdCB0aGlzLl9oYW5kbGVIZWFkZXJPcGVyYXRpb25TdGF0dXMoc3RhdHVzLCByZXNwb25zZS50cmFuc2FjdGlvbkluZm8pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGFzUGVuZGluZ1JlYXNvbnM6IGJvb2xlYW4gPSByZXNwb25zZS5oZWFkZXJPcGVyYXRpb25TdGF0dXNlcy5maWx0ZXIobG9zID0+IGxvcy5wZW5kaW5nUmVhc29uICE9PSBcIk5PTkVcIikubGVuZ3RoID4gMDtcclxuICAgIGlmICghaGFzUGVuZGluZ1JlYXNvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZVRyYW5zYWN0aW9uQW5kQ29tbWl0KCk7XHJcbiAgICAgIH0gZWxzZSB7IC8vIGp1c3QgcmVwbGFjZSB0cmFuc2FjdGlvbiBvYmplY3RcclxuICAgICAgICB0aGlzLnJlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2F2ZVRyYW5zYWN0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLnNhdmVUcmFuc2FjdGlvbih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZClcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5pc1N1Y2Nlc3MpIHtcclxuICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiAodmFsdWUgJiYgdmFsdWUudHJhbnNhY3Rpb25MaW5lcykge1xyXG4gICAgLy8gICB2YWx1ZS50cmFuc2FjdGlvbkxpbmVzLnNvcnQoKGEsIGIpID0+IGEubGluZU5yIDwgYi5saW5lTnIgPyAtMSA6IDEpO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMuX3NldEFtb3VudCgpO1xyXG4gICAgdGhpcy5fY2hlY2tQdXJjaGFzZU9yZGVycygpO1xyXG4gICAgdGhpcy5fY2hlY2tSZWNlaXZlZEdvb2RzKCk7XHJcbiAgICB0aGlzLl9jaGVja0dvb2RzQWxsb2NhdGlvbigpO1xyXG4gICAgdGhpcy5fY2hlY2tQdXJjaGFzZU9yZGVyQ29uZmlybWF0aW9uKCk7XHJcbiAgICB0aGlzLl9jaGVja0RlbGl2ZXJ5KCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnJlbGF0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5yZWxhdGlvbi5yZWxhdGlvbklkICYmICF0aGlzLnJlbGF0aW9uLnJlbGF0aW9uSWQpIHtcclxuICAgICAgdGhpcy5fZ2V0UmVsYXRpb24odGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnJlbGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uVXBkYXRlZC5uZXh0KHRoaXMuY3VycmVudFRyYW5zYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3NhdmVUcmFuc2FjdGlvbkFuZENvbW1pdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIHdlIGNhbiBzYWZlbHkgc2F2ZS9jb21taXQgdGhlIGNoYW5nZXNcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IGF3YWl0IHRoaXMuc2F2ZVRyYW5zYWN0aW9uKCk7XHJcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuaXNTdWNjZXNzKSB7XHJcbiAgICAgIHRoaXMucmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gd2UgbmVlZCB0byBkbyBhbiBleHRyYSBjb21taXQgdG8gcmVsZWFzZSB0aGUgbG9ja1xyXG4gICAgY29uc3QgY29tbWl0U3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbWl0KCk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UgJiYgcmVzcG9uc2UuaXNTdWNjZXNzICYmIGNvbW1pdFN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbGF0aW9uKSB7XHJcbiAgICAgIHRoaXMucmVsYXRpb24gPSBuZXcgQ3VzdG9tZXJGdWxsT2JqZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucmVsYXRpb24ucmVsYXRpb25JZCkge1xyXG4gICAgICBpZiAodGhpcy5yZWxhdGlvbi5yZWxhdGlvblR5cGUgPT09IFJlbGF0aW9uS2luZC5DdXN0b21lcikge1xyXG4gICAgICAgICh0aGlzLnJlbGF0aW9uIGFzIEN1c3RvbWVyRnVsbE9iamVjdCkucmVsYXRpb25TdGF0dXMgPSBSZWxhdGlvblN0YXR1cy5SZWd1bGFyQ3VzdG9tZXI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWxhdGlvbi5zdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5wcmVmZXJyZWREZWxpdmVyeURhdGUyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnByZWZlcnJlZERlbGl2ZXJ5RGF0ZTIgPSBcIj1cIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBpZiAoIXJlc3BvbnNlLmxpbmVPcGVyYXRpb25TdGF0dXNlcyB8fCByZXNwb25zZS5saW5lT3BlcmF0aW9uU3RhdHVzZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAvLyAgIHJldHVybiB0aGlzLmF1dG9TYXZlID8gdGhpcy5fc2F2ZVRyYW5zYWN0aW9uQW5kQ29tbWl0KCkgOiB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJlc3BvbnNlLmxpbmVPcGVyYXRpb25TdGF0dXNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzdGF0dXM6IExpbmVPcGVyYXRpb25TdGF0dXMgPSByZXNwb25zZS5saW5lT3BlcmF0aW9uU3RhdHVzZXNbaV07XHJcbiAgICAgIGNvbnN0IHRyYW5zTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbyA9IHJlc3BvbnNlLnRyYW5zYWN0aW9uTGluZXMuZmluZCh0ID0+IHQubGluZU5yID09PSBzdGF0dXMubGluZU5yKTtcclxuICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgYXdhaXQgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cyhzdGF0dXMsIHRyYW5zTGluZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBoYXNQZW5kaW5nUmVhc29uczogYm9vbGVhbiA9IHJlc3BvbnNlLmxpbmVPcGVyYXRpb25TdGF0dXNlcy5maWx0ZXIobG9zID0+IGxvcy5wZW5kaW5nUmVhc29uICE9PSBcIk5PTkVcIikubGVuZ3RoID4gMDtcclxuICAgIGlmICghaGFzUGVuZGluZ1JlYXNvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZVRyYW5zYWN0aW9uQW5kQ29tbWl0KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cyhvcGVyYXRpb25TdGF0dXM6IExpbmVPcGVyYXRpb25TdGF0dXMsIHRyYW5zYWN0aW9uTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgc3dpdGNoIChvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpIHtcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5BQk9SVEVEOlxyXG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLkNBTkNFTExFRDpcclxuICAgICAgICBpZiAob3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24gIT09ICdVU0VSX0RFQ0lTSU9OJykge1xyXG4gICAgICAgIC8vICAgYXdhaXQgdGhpcy5fY2FuY2VsQXJ0aWNsZShvcGVyYXRpb25TdGF0dXMudXVpZCk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3Nob3dSZWFzb25EaWFsb2cob3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQ09ORklSTUFUSU9OX05FRURFRDpcclxuICAgICAgICBhd2FpdCB0aGlzLl9jb25maXJtQWN0aW9uKHRyYW5zYWN0aW9uTGluZS51dWlkLCBvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbiwgb3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb25UeXBlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5JTlZBTElEX0xPR0lTVElDUzpcclxuICAgICAgICBhd2FpdCB0aGlzLl9zaG93V2FyZWhvdXNlQ2NEaWFsb2coXHJcbiAgICAgICAgICBvcGVyYXRpb25TdGF0dXMudXVpZCwgdHJhbnNhY3Rpb25MaW5lLmFtb3VudCwgdHJhbnNhY3Rpb25MaW5lLmNvbW1pc3Npb25Db2RlLCB0cmFuc2FjdGlvbkxpbmUud2FyZWhvdXNlTnVtYmVyLFxyXG4gICAgICAgICAgb3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24sIG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuTk9OX0NSSVRJQ0FMX0RJU0NPTlRJTlVBVElPTjpcclxuICAgICAgICB0aGlzLl9zaG93UmVhc29uRGlhbG9nKG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5DSEFSQUNURVJJU1RJQ1NfQU5TV0VSX05FRURFRDpcclxuICAgICAgICB0aGlzLl9zaG93Q2hhcmFjdGVyaXN0aWNEaWFsb2cob3BlcmF0aW9uU3RhdHVzLnV1aWQsIG9wZXJhdGlvblN0YXR1cy5jaGFyYWN0ZXJpc3RpYywgb3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24sIG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuTk9ORTpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUhlYWRlck9wZXJhdGlvblN0YXR1cyhvcGVyYXRpb25TdGF0dXM6IEhlYWRlck9wZXJhdGlvblN0YXR1cywgdHJhbnNhY3Rpb25JbmZvOiBUcmFuc2FjdGlvbkluZm8pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHN3aXRjaCAob3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb25UeXBlKSB7XHJcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQUJPUlRFRDpcclxuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5DQU5DRUxMRUQ6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc2hvd1JlYXNvbkRpYWxvZyhvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLkNPTkZJUk1BVElPTl9ORUVERUQ6XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpcm1IZWFkZXJBY3Rpb24odHJhbnNhY3Rpb25JbmZvLnV1aWQsIG9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uLCBvcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpO1xyXG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLk5PTkU6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHBlbmRpbmdMaW5lVmFsdWVzOiBSZXNvbHZlTGluZVBlbmRpbmdSZWFzb25SZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24ocGVuZGluZ0xpbmVWYWx1ZXMpO1xyXG4gICAgLy8gdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XHJcbiAgICB0aGlzLmhhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXNlcyhyZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZVBlbmRpbmdIZWFkZXJSZWFzb24ocGVuZGluZ0hlYWRlclZhbHVlczogUmVzb2x2ZUhlYWRlclBlbmRpbmdSZWFzb25SZXF1ZXN0KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5yZXNvbHZlUGVuZGluZ0hlYWRlclJlYXNvbihwZW5kaW5nSGVhZGVyVmFsdWVzKTtcclxuICAgIC8vIHRoaXMucmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlSGVhZGVyT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uSW5mbyh0cmFuc0lkOiBudW1iZXIsIGxpbmVJZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9IaXN0b3J5W10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkluZm8odHJhbnNJZCwgbGluZUlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRHb29kc1JlY2VpcHRTdGF0dXModHJhbnNJZDogbnVtYmVyLCBsaW5lTnI6IG51bWJlcik6IFByb21pc2U8R29vZHNSZWNlaXB0U3RhdHVzV2l0aEhpc3Rvcnk+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRHb29kc1JlY2VpcHRTdGF0dXModHJhbnNJZCwgbGluZU5yKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWxpdmVyeU9yZGVyU3RhdHVzKHRyYW5zSWQ6IG51bWJlciwgbGluZUlkOiBudW1iZXIpOiBQcm9taXNlPERlbGl2ZXJ5T3JkZXJTdGF0dXM+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXREZWxpdmVyeU9yZGVyU3RhdHVzKHRyYW5zSWQsIGxpbmVJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0R29vZHNBbGxvY2F0aW9uU3RhdHVzKHRyYW5zSWQ6IG51bWJlciwgbGluZU5yOiBudW1iZXIpOiBQcm9taXNlPEdvb2RzQWxsb2NhdGlvblN0YXR1cz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEdvb2RzQWxsb2NhdGlvblN0YXR1cyh0cmFuc0lkLCBsaW5lTnIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFB1cmNoYXNlUG9ydGFsTGluZXMocmVxdWVzdDogR2V0UHVyY2hhc2VQb3J0YWxMaW5lKTogUHJvbWlzZTxQdXJjaGFzZVBvcnRhbExpbmVbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFB1cmNoYXNlUG9ydGFsTGluZXMocmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgX2NoZWNrUHVyY2hhc2VPcmRlcnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnRyYW5zYWN0aW9uS2luZCA9PT0gVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXIgJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcykge1xyXG4gICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgY29uc3QgYW1vdW50VHJhbnNMaW5lQ29tbUNvZGVaZXJvOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzLmZpbHRlcihsID0+IGwuY29tbWlzc2lvbkNvZGUgPT09IFwiMFwiKS5sZW5ndGg7XHJcbiAgICAgIGxldCBhbW91bnRQdXJjaGFzZU9yZGVyczogbnVtYmVyID0gMDtcclxuICAgICAgY29uc3QgdHJhbnNJZDogbnVtYmVyID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLmlkO1xyXG4gICAgICBjb25zdCBhcnRpY2xlVHJhbnNMaW5lczogVHJhbnNhY3Rpb25MaW5lSW5mb1tdID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodCA9PiB0LmlzQXJ0aWNsZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJ0aWNsZVRyYW5zTGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0cmFuc0xpbmU6IFRyYW5zYWN0aW9uTGluZUluZm8gPSBhcnRpY2xlVHJhbnNMaW5lc1tpXTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvbkluZm8odHJhbnNJZCwgdHJhbnNMaW5lLmxpbmVOcikudGhlbigodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbkluZm9IaXN0b3J5W10pID0+IHtcclxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9ucyAmJiB0cmFuc2FjdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHRyYW5zTGluZS5wdXJjaGFzZU9yZGVySWQgPSB0cmFuc2FjdGlvbnNbMF0udHJhbnNJZDtcclxuICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlLnRyYW5zYWN0aW9uTGluZUNoYW5nZWQubmV4dCh0cmFuc0xpbmUpO1xyXG4gICAgICAgICAgICAgIGFtb3VudFB1cmNoYXNlT3JkZXJzKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wdXJjaGFzZU9yZGVyc0NvbXBsZXRlZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMubGVuZ3RoID4gMCAmJiAoYW1vdW50VHJhbnNMaW5lQ29tbUNvZGVaZXJvID09PSBhbW91bnRQdXJjaGFzZU9yZGVycyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIF9jaGVja1JlY2VpdmVkR29vZHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnRyYW5zYWN0aW9uS2luZCA9PT0gVHJhbnNhY3Rpb25LaW5kLlB1cmNoYXNlT3JkZXIgJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcykge1xyXG4gICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgY29uc3QgdHJhbnNJZDogbnVtYmVyID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLmlkO1xyXG4gICAgICBjb25zdCBhcnRpY2xlVHJhbnNMaW5lczogVHJhbnNhY3Rpb25MaW5lSW5mb1tdID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodCA9PiB0LmlzQXJ0aWNsZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJ0aWNsZVRyYW5zTGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0cmFuc0xpbmU6IFRyYW5zYWN0aW9uTGluZUluZm8gPSBhcnRpY2xlVHJhbnNMaW5lc1tpXTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5nZXRHb29kc1JlY2VpcHRTdGF0dXModHJhbnNJZCwgdHJhbnNMaW5lLmxpbmVOcikudGhlbigoZ29vZHNSZWNlaXB0U3RhdHVzOiBHb29kc1JlY2VpcHRTdGF0dXMpID0+IHtcclxuICAgICAgICAgICAgdHJhbnNMaW5lLnF1YW50aXR5VG9SZWNlaXZlID0gZ29vZHNSZWNlaXB0U3RhdHVzLnF1YW50aXR5VG9SZWNlaXZlO1xyXG4gICAgICAgICAgICB0cmFuc0xpbmUucXVhbnRpdHlSZWNlaXZlZCA9IGdvb2RzUmVjZWlwdFN0YXR1cy5xdWFudGl0eVJlY2VpdmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlLnRyYW5zYWN0aW9uTGluZUNoYW5nZWQubmV4dCh0cmFuc0xpbmUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnJlY2VpdmVHb29kc0NvbXBsZXRlZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmluZChsID0+IGwucXVhbnRpdHlUb1JlY2VpdmUgIT09IDApID09PSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIF9jaGVja0RlbGl2ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby50cmFuc2FjdGlvbktpbmQgPT09IFRyYW5zYWN0aW9uS2luZC5TYWxlc09yZGVyICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMpIHtcclxuICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgIGNvbnN0IHRyYW5zSWQ6IG51bWJlciA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5pZDtcclxuICAgICAgY29uc3QgYXJ0aWNsZVRyYW5zTGluZXM6IFRyYW5zYWN0aW9uTGluZUluZm9bXSA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmlsdGVyKHQgPT4gdC5pc0FydGljbGUpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFydGljbGVUcmFuc0xpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNMaW5lOiBUcmFuc2FjdGlvbkxpbmVJbmZvID0gYXJ0aWNsZVRyYW5zTGluZXNbaV07XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChcclxuICAgICAgICAgIHRoaXMuZ2V0RGVsaXZlcnlPcmRlclN0YXR1cyh0cmFuc0lkLCB0cmFuc0xpbmUubGluZU5yKS50aGVuKChyZXN1bHQ6IERlbGl2ZXJ5T3JkZXJTdGF0dXMpID0+IHtcclxuICAgICAgICAgICAgdHJhbnNMaW5lLnF1YW50aXR5VG9EZWxpdmVyID0gcmVzdWx0LnF1YW50aXR5VG9EZWxpdmVyO1xyXG4gICAgICAgICAgICB0cmFuc0xpbmUucXVhbnRpdHlUb0ludm9pY2UgPSByZXN1bHQucXVhbnRpdHlUb0ludm9pY2U7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25FdmVudFNlcnZpY2UudHJhbnNhY3Rpb25MaW5lQ2hhbmdlZC5uZXh0KHRyYW5zTGluZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGVsaXZlcnlDb21wbGV0ZWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzLmZpbmQobCA9PiBsLnF1YW50aXR5RGVsaXZlcmVkICE9PSBsLmFtb3VudCkgPT09IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmludm9pY2VDb21wbGV0ZWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzLmZpbmQobCA9PiBsLnF1YW50aXR5SW52b2ljZWQgIT09IGwuYW1vdW50KSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBfY2hlY2tHb29kc0FsbG9jYXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnRyYW5zYWN0aW9uS2luZCA9PT0gVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXIgJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcykge1xyXG4gICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgY29uc3QgdHJhbnNJZDogbnVtYmVyID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLmlkO1xyXG4gICAgICBjb25zdCBhcnRpY2xlVHJhbnNMaW5lczogVHJhbnNhY3Rpb25MaW5lSW5mb1tdID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodCA9PiB0LmlzQXJ0aWNsZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJ0aWNsZVRyYW5zTGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0cmFuc0xpbmU6IFRyYW5zYWN0aW9uTGluZUluZm8gPSBhcnRpY2xlVHJhbnNMaW5lc1tpXTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKFxyXG4gICAgICAgIHRoaXMuZ2V0R29vZHNBbGxvY2F0aW9uU3RhdHVzKHRyYW5zSWQsIHRyYW5zTGluZS5saW5lTnIpLnRoZW4oKGdvb2RzQWxsb2NhdGlvblN0YXR1czogR29vZHNBbGxvY2F0aW9uU3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zTGluZS5xdWFudGl0eVRvQWxsb2NhdGUgPSBnb29kc0FsbG9jYXRpb25TdGF0dXMucXVhbnRpdHlUb0FsbG9jYXRlO1xyXG4gICAgICAgICAgICB0cmFuc0xpbmUucXVhbnRpdHlBbGxvY2F0ZWQgPSBnb29kc0FsbG9jYXRpb25TdGF0dXMucXVhbnRpdHlBbGxvY2F0ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25FdmVudFNlcnZpY2UudHJhbnNhY3Rpb25MaW5lQ2hhbmdlZC5uZXh0KHRyYW5zTGluZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYWxsb2NhdGVHb29kc0NvbXBsZXRlZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmluZChsID0+IC8qbC5jb21taXNzaW9uQ29kZSA9PT0gXCIxXCIgJiYqLyBsLnF1YW50aXR5VG9BbGxvY2F0ZSAhPT0gMCkgPT09IHVuZGVmaW5lZDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgX2NoZWNrUHVyY2hhc2VPcmRlckNvbmZpcm1hdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb21wbGV0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby50cmFuc2FjdGlvbktpbmQgPT09IFRyYW5zYWN0aW9uS2luZC5QdXJjaGFzZU9yZGVyICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMpIHtcclxuICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgIGNvbnN0IHRyYW5zSWQ6IG51bWJlciA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5pZDtcclxuICAgICAgY29uc3QgYXJ0aWNsZVRyYW5zTGluZXM6IFRyYW5zYWN0aW9uTGluZUluZm9bXSA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmlsdGVyKHQgPT4gdC5pc0FydGljbGUpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFydGljbGVUcmFuc0xpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNMaW5lOiBUcmFuc2FjdGlvbkxpbmVJbmZvID0gYXJ0aWNsZVRyYW5zTGluZXNbaV07XHJcbiAgICAgICAgY29uc3QgcHVyY2hhc2VQb3J0YWxGaWx0ZXI6IFB1cmNoYXNlUG9ydGFsRmlsdGVycyA9IG5ldyBQdXJjaGFzZVBvcnRhbEZpbHRlcnMoKTtcclxuICAgICAgICBjb25zdCBnZXRQdXJjaGFzZVBvcnRhbExpbmU6IEdldFB1cmNoYXNlUG9ydGFsTGluZSA9IG5ldyBHZXRQdXJjaGFzZVBvcnRhbExpbmUoKTtcclxuICAgICAgICBwdXJjaGFzZVBvcnRhbEZpbHRlci5wdXJjaGFzZU9yZGVyTm8gPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udHJhbnNhY3Rpb25Oci50b1N0cmluZygpO1xyXG4gICAgICAgIHB1cmNoYXNlUG9ydGFsRmlsdGVyLmxpbmVJZCA9IHRyYW5zTGluZS5saW5lTnIudG9TdHJpbmcoKTtcclxuICAgICAgICBnZXRQdXJjaGFzZVBvcnRhbExpbmUudHJhbnNJZFB1cmNoYXNlID0gdHJhbnNJZDtcclxuICAgICAgICBnZXRQdXJjaGFzZVBvcnRhbExpbmUuZmlsdGVyT2JqZWN0ID0gcHVyY2hhc2VQb3J0YWxGaWx0ZXI7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChcclxuICAgICAgICAgIHRoaXMuZ2V0UHVyY2hhc2VQb3J0YWxMaW5lcyhnZXRQdXJjaGFzZVBvcnRhbExpbmUpLnRoZW4oKGxpbmVzOiBQdXJjaGFzZVBvcnRhbExpbmVbXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobGluZXMgJiYgbGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHRyYW5zTGluZS5wdXJjaGFzZVBvcnRhbExpbmUgPSBsaW5lc1swXTtcclxuICAgICAgICAgICAgICBpZiAodHJhbnNMaW5lLnB1cmNoYXNlUG9ydGFsTGluZS5hbW91bnRPcmRlcmVkICE9PSB0cmFuc0xpbmUucHVyY2hhc2VQb3J0YWxMaW5lLmFtb3VudENvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICAgICAgY29tcGxldGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25FdmVudFNlcnZpY2UudHJhbnNhY3Rpb25MaW5lQ2hhbmdlZC5uZXh0KHRyYW5zTGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wdXJjaGFzZU9yZGVyQ29uZmlybWF0aW9uQ29tcGxldGVkID0gY29tcGxldGVkO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2NvbmZpcm1BY3Rpb24odXVpZDogc3RyaW5nLCByZWFzb246IHN0cmluZywgdHlwZTogUGVuZGluZ1JlYXNvblR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlYXNvblJlcXVlc3QgPSBuZXcgUmVzb2x2ZUxpbmVQZW5kaW5nUmVhc29uUmVxdWVzdCh1dWlkLCByZWFzb24sIHR5cGUpO1xyXG4gICAgLy8gY29uc3QgcGVuZGluZ1JlYXNvblRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuX2dldFBlbmRpbmdSZWFzb25UZXh0KHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uKTtcclxuICAgIHJlYXNvblJlcXVlc3QuY29uZmlybWF0aW9uID0gYXdhaXQgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dZZXNObygnQWN0aW9uJywgcmVhc29uKTtcclxuICAgIGF3YWl0IHRoaXMucmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHJlYXNvblJlcXVlc3QpO1xyXG4gICAgLy8gdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cygpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9zaG93Q2hhcmFjdGVyaXN0aWNEaWFsb2codXVpZDogc3RyaW5nLCBjaGFyYWN0ZXJpc3RpY3M6IFRyYW5zYWN0aW9uTGluZUNoYXJhY3RlcmlzdGljLCByZWFzb246IHN0cmluZywgdHlwZTogUGVuZGluZ1JlYXNvblR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlYXNvblJlcXVlc3QgPSBuZXcgUmVzb2x2ZUxpbmVQZW5kaW5nUmVhc29uUmVxdWVzdCh1dWlkLCByZWFzb24sIHR5cGUpO1xyXG4gICAgbGV0IGNoYXI6IHN0cmluZztcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEaWFsb2dSZXNwb25zZUludGVyZmFjZSA9IGF3YWl0IHRoaXMuZGlhbG9nU2VydmljZS5zaG93Q2hhcmFjdGVyaXN0aWNzKFxyXG4gICAgICBjaGFyYWN0ZXJpc3RpY3MucXVlc3Rpb24sIGNoYXJhY3RlcmlzdGljcy50cmFuc2FjdGlvbkxpbmVDaGFyYWN0ZXJpc3RpY0Nob2ljZXMsIGNoYXJhY3RlcmlzdGljcy52YWx1ZSk7XHJcbiAgICBpZiAocmVzcG9uc2UuYnV0dG9uID09PSBBcHBQb3B1cEJ1dHRvblR5cGUuT2spIHtcclxuICAgICAgY2hhciA9IHJlc3BvbnNlLm91dHB1dDtcclxuICAgIH1cclxuICAgIHJlYXNvblJlcXVlc3QudGV4dHVhbFVzZXJJbnB1dCA9IGNoYXI7XHJcbiAgICBhd2FpdCB0aGlzLnJlc29sdmVQZW5kaW5nTGluZVJlYXNvbihyZWFzb25SZXF1ZXN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3Nob3dXYXJlaG91c2VDY0RpYWxvZyh1dWlkOiBzdHJpbmcsIHF1YW50aXR5OiBudW1iZXIsIGNvbW1pc3Npb25Db2RlOiBzdHJpbmcsIHdhcmVob3VzZU5yOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nLCB0eXBlOiBQZW5kaW5nUmVhc29uVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcmVhc29uUmVxdWVzdCA9IG5ldyBSZXNvbHZlTGluZVBlbmRpbmdSZWFzb25SZXF1ZXN0KHV1aWQsIHJlYXNvbiwgdHlwZSk7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGlhbG9nUmVzcG9uc2VJbnRlcmZhY2UgPSBhd2FpdCB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd1dhcmVob3VzZUNDKHF1YW50aXR5LCBjb21taXNzaW9uQ29kZSwgd2FyZWhvdXNlTnIpO1xyXG4gICAgaWYgKHJlc3BvbnNlLmJ1dHRvbiA9PT0gQXBwUG9wdXBCdXR0b25UeXBlLk9rKSB7XHJcbiAgICAgIHJlYXNvblJlcXVlc3QucXVhbnRpdHkgPSByZXNwb25zZS5vdXRwdXQucXVhbnRpdHk7XHJcbiAgICAgIHJlYXNvblJlcXVlc3QuY29tbWlzc2lvbkNvZGUgPSByZXNwb25zZS5vdXRwdXQuY29tbWlzc2lvbkNvZGU7XHJcbiAgICAgIHJlYXNvblJlcXVlc3Qud2FyZWhvdXNlTnIgPSByZXNwb25zZS5vdXRwdXQud2FyZWhvdXNlTnI7XHJcbiAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHJlYXNvblJlcXVlc3QpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fY2FuY2VsQXJ0aWNsZSh1dWlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2NvbmZpcm1IZWFkZXJBY3Rpb24odXVpZDogc3RyaW5nLCByZWFzb246IHN0cmluZywgdHlwZTogUGVuZGluZ1JlYXNvblR5cGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHJlYXNvblJlcXVlc3QgPSBuZXcgUmVzb2x2ZUhlYWRlclBlbmRpbmdSZWFzb25SZXF1ZXN0KHV1aWQsIHJlYXNvbiwgdHlwZSk7XHJcbiAgICAvLyBjb25zdCBwZW5kaW5nUmVhc29uVGV4dDogc3RyaW5nID0gYXdhaXQgdGhpcy5fZ2V0UGVuZGluZ1JlYXNvblRleHQodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24pO1xyXG4gICAgcmVhc29uUmVxdWVzdC5jb25maXJtYXRpb24gPSBhd2FpdCB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd1llc05vKCdBY3Rpb24nLCByZWFzb24pO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzb2x2ZVBlbmRpbmdIZWFkZXJSZWFzb24ocmVhc29uUmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9zaG93UmVhc29uRGlhbG9nKHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dJbmZvcm1hdGlvbihyZWFzb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0QW1vdW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMpIHtcclxuICAgICAgdGhpcy5hcnRpY2xlQW1vdW50ID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodCA9PiB0LmxpbmVUeXBlID09PSBUcmFuc2FjdGlvbkxpbmVUeXBlLkFydGljbGVMaW5lKS5sZW5ndGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9jYW5jZWxBcnRpY2xlKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jYW5jZWxBZGRUcmFuc2FjdGlvbkxpbmUodXVpZCwgZmFsc2UpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFJlbGF0aW9uQ2xhc3ModHJhbnNhY3Rpb25LaW5kOiBUcmFuc2FjdGlvbktpbmQpOiB0eXBlb2YgUmVsYXRpb24ge1xyXG4gICAgaWYgKHRoaXMuX3JlbGF0aW9uQ2xhc3NGcm9tVHJhbnNhY3Rpb25LaW5kLmhhcyh0cmFuc2FjdGlvbktpbmQpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9yZWxhdGlvbkNsYXNzRnJvbVRyYW5zYWN0aW9uS2luZC5nZXQodHJhbnNhY3Rpb25LaW5kKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBSZWxhdGlvbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFJlbGF0aW9uKHJlbGF0aW9uOiBSZWxhdGlvblNtYWxsT2JqZWN0KTogdm9pZCB7XHJcbiAgICBpZiAocmVsYXRpb24pIHtcclxuICAgICAgdGhpcy5yZWxhdGlvblNlcnZpY2UuZ2V0UmVsYXRpb25OdW1iZXIocmVsYXRpb24ucmVsYXRpb25JZCkudGhlbigocmVsYXRpb25Ocjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlbGF0aW9uLnJlbGF0aW9uVHlwZSA9PT0gUmVsYXRpb25LaW5kLkN1c3RvbWVyKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbGF0aW9uU2VydmljZS5nZXRDdXN0b21lckZ1bGxPYmplY3QocGFyc2VJbnQocmVsYXRpb25OciwgMCkpLnRoZW4oKGN1c3RvbWVyOiBDdXN0b21lckZ1bGxPYmplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWxhdGlvbiA9IGN1c3RvbWVyO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbi5yZWxhdGlvblR5cGUgPT09IFJlbGF0aW9uS2luZC5TdXBwbGllcikge1xyXG4gICAgICAgICAgdGhpcy5yZWxhdGlvblNlcnZpY2UuZ2V0U3VwcGxpZXJGdWxsT2JqZWN0KHBhcnNlSW50KHJlbGF0aW9uTnIsIDApKS50aGVuKChzdXBwbGllcjogU3VwcGxpZXJGdWxsT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsYXRpb24gPSBzdXBwbGllcjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|