@sabstravtech/obtservices 0.0.22042501 → 0.0.22051001
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/angular/fetchers.d.ts +8 -0
- package/angular/lib/vendor/fetchers/fast-track-quote.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-all-airlines.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-cancellation-info.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-car-hire-providers.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-hotel-chains.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-irl-supplier-station.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-rail-providers.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/send-offline-notification.fetcher.d.ts +7 -0
- package/angular/lib/vendor/services/enterprise-basket.service.d.ts +4 -3
- package/angular/lib/vendor/services/search.service.d.ts +10 -3
- package/angular/lib/vendor/services/ticket-queue.service.d.ts +6 -0
- package/angular/lib/vendor/services/user.service.d.ts +5 -3
- package/angular/lib/vendor/types/graphql.angular.types.d.ts +438 -16
- package/angular/lib/vendor/updaters/edit-user.updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/set-user-language-updater.d.ts +6 -0
- package/angular/sabstravtech-obtservices-angular.d.ts +16 -13
- package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
- package/angular/services.d.ts +1 -0
- package/base/fetchers.d.ts +10 -0
- package/base/interfaces.d.ts +2 -0
- package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +2 -1
- package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +8 -2
- package/base/lib/vendor/classes/fast-track-enterprise-search.d.ts +57 -0
- package/base/lib/vendor/classes/flight-enterprise-search.d.ts +2 -1
- package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +3 -1
- package/base/lib/vendor/classes/irl-enterprise-search.d.ts +27 -7
- package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/classes/management-info-and-valid.d.ts +6 -1
- package/base/lib/vendor/classes/modal-types.enum.d.ts +2 -0
- package/base/lib/vendor/classes/parking-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/classes/rail-enterprise-search.d.ts +3 -2
- package/base/lib/vendor/fetchers/fast-track-quote.fetcher.d.ts +23 -0
- package/base/lib/vendor/fetchers/get-all-airlines.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-cancellation-info.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-car-hire-providers.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-hotel-chains.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-irl-supplier-station.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-rail-providers.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/send-offline-notification.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/user-fetcher.d.ts +2 -3
- package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +6 -3
- package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/interfaces/Ifast-track-enterprise-search.d.ts +26 -0
- package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +11 -3
- package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +1 -0
- package/base/lib/vendor/interfaces/Isearch.service.d.ts +7 -1
- package/base/lib/vendor/interfaces/Iuser.service.d.ts +2 -1
- package/base/lib/vendor/interfaces/eurostar-search-arg.interface.d.ts +2 -0
- package/base/lib/vendor/interfaces/fast-track-filters.interface.d.ts +4 -0
- package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +2 -0
- package/base/lib/vendor/interfaces/summary-interface.d.ts +2 -0
- package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
- package/base/lib/vendor/models/traveller.object.d.ts +1 -0
- package/base/lib/vendor/services/enterprise-basket.service.d.ts +13 -6
- package/base/lib/vendor/services/requires-reason.service.d.ts +20 -0
- package/base/lib/vendor/services/search.service.d.ts +30 -5
- package/base/lib/vendor/services/user.service.d.ts +12 -5
- package/base/lib/vendor/services/webtoken.service.d.ts +1 -0
- package/base/lib/vendor/types/graphql.types.d.ts +398 -16
- package/base/lib/vendor/types/types.d.ts +53 -16
- package/base/lib/vendor/updaters/edit-user-updater.d.ts +19 -0
- package/base/lib/vendor/updaters/set-user-language-updater.d.ts +19 -0
- package/base/sabstravtech-obtservices-base.d.ts +5 -5
- package/base/sabstravtech-obtservices-base.metadata.json +1 -1
- package/base/services.d.ts +1 -0
- package/base/updaters.d.ts +2 -0
- package/bundles/sabstravtech-obtservices-angular.umd.js +499 -91
- package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.js +3204 -176
- package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
- package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
- package/esm2015/angular/fetchers.js +9 -1
- package/esm2015/angular/lib/vendor/fetchers/fast-track-quote.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-all-airlines.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-cancellation-info.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-car-hire-providers.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-hotel-chains.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-irl-supplier-station.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-rail-providers.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/send-offline-notification.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +8 -5
- package/esm2015/angular/lib/vendor/services/http-call.service.js +6 -2
- package/esm2015/angular/lib/vendor/services/search.service.js +58 -37
- package/esm2015/angular/lib/vendor/services/ticket-queue.service.js +23 -0
- package/esm2015/angular/lib/vendor/services/user.service.js +12 -6
- package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +583 -5
- package/esm2015/angular/lib/vendor/updaters/edit-user.updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/set-user-language-updater.js +22 -0
- package/esm2015/angular/obtservices.module.js +3 -1
- package/esm2015/angular/sabstravtech-obtservices-angular.js +17 -14
- package/esm2015/angular/services.js +2 -1
- package/esm2015/base/fetchers.js +11 -1
- package/esm2015/base/interfaces.js +3 -1
- package/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +4 -1
- package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +37 -5
- package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +46 -16
- package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +77 -10
- package/esm2015/base/lib/vendor/classes/fast-track-enterprise-search.js +296 -0
- package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +44 -5
- package/esm2015/base/lib/vendor/classes/helpers.js +6 -2
- package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +58 -19
- package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +214 -25
- package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +22 -6
- package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +1 -1
- package/esm2015/base/lib/vendor/classes/modal-types.enum.js +3 -1
- package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +27 -7
- package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +62 -13
- package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +2 -2
- package/esm2015/base/lib/vendor/fetchers/fast-track-quote.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-all-airlines.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-cancellation-info.fetcher.js +10 -0
- package/esm2015/base/lib/vendor/fetchers/get-car-hire-providers.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-hotel-chains.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-irl-supplier-station.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-rail-providers.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/send-offline-notification.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/user-fetcher.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ifast-track-enterprise-search.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/eurostar-search-arg.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/fast-track-filters.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/summary-interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
- package/esm2015/base/lib/vendor/models/traveller.object.js +3 -2
- package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +63 -17
- package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +16 -12
- package/esm2015/base/lib/vendor/services/requires-reason.service.js +49 -0
- package/esm2015/base/lib/vendor/services/search.service.js +166 -20
- package/esm2015/base/lib/vendor/services/user.service.js +44 -6
- package/esm2015/base/lib/vendor/services/webtoken.service.js +9 -5
- package/esm2015/base/lib/vendor/types/graphql.types.js +9 -1
- package/esm2015/base/lib/vendor/types/types.js +1704 -1
- package/esm2015/base/lib/vendor/updaters/edit-user-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/set-user-language-updater.js +11 -0
- package/esm2015/base/sabstravtech-obtservices-base.js +6 -5
- package/esm2015/base/services.js +2 -1
- package/esm2015/base/updaters.js +3 -1
- package/fesm2015/sabstravtech-obtservices-angular.js +790 -19
- package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
- package/fesm2015/sabstravtech-obtservices-base.js +3041 -169
- package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
import { ServiceType } from '../types/graphql.types';
|
|
4
|
+
import { BaseEnterpriseSearch } from './base-enterprise';
|
|
5
|
+
export class FastTrackEnterpriseSearch extends BaseEnterpriseSearch {
|
|
6
|
+
constructor(fasttrackFetcher, helpers, basketService, storageService, searchService) {
|
|
7
|
+
super(storageService, helpers);
|
|
8
|
+
this.fasttrackFetcher = fasttrackFetcher;
|
|
9
|
+
this.basketService = basketService;
|
|
10
|
+
this.searchService = searchService;
|
|
11
|
+
this.type = ServiceType.FastTrack;
|
|
12
|
+
this._date = null;
|
|
13
|
+
this._time = null;
|
|
14
|
+
this.resultsSessionName = FastTrackEnterpriseSearch.STORAGE_SESSION_RESULTS;
|
|
15
|
+
this.multiResultsSessionName = FastTrackEnterpriseSearch.STORAGE_SESSION_RESULTS;
|
|
16
|
+
const data = storageService.getSessionItem(FastTrackEnterpriseSearch.STORAGE_SESSION_PARAMS) || {
|
|
17
|
+
tempParams: {},
|
|
18
|
+
originalUserSearch: {}
|
|
19
|
+
};
|
|
20
|
+
this._originalUserSearch = data.originalUserSearch;
|
|
21
|
+
this.updateTempParams(searchService.makeFastTrackQuery(data.tempParams));
|
|
22
|
+
if (searchService.shouldAddTravellerSubscription()) {
|
|
23
|
+
searchService.travellerInformation.subscribe((travellers) => {
|
|
24
|
+
const splitTravellers = this.helpers.selectedTravellers(travellers, ServiceType.FastTrack);
|
|
25
|
+
this.tempParams.adults = splitTravellers.adults.length;
|
|
26
|
+
this.tempParams.children = splitTravellers.children.length;
|
|
27
|
+
this.travellers = travellers;
|
|
28
|
+
this._isValid();
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const results = storageService.getSessionItemAsList(this.resultsSessionName) || [];
|
|
32
|
+
this._cheapestResultPrice = this.updateLowestPrice(results);
|
|
33
|
+
this.results.next(results || []);
|
|
34
|
+
}
|
|
35
|
+
get adults() {
|
|
36
|
+
return this.tempParams.adults;
|
|
37
|
+
}
|
|
38
|
+
set adults(value) {
|
|
39
|
+
this.tempParams.adults = value;
|
|
40
|
+
this._isValid();
|
|
41
|
+
}
|
|
42
|
+
get children() {
|
|
43
|
+
return this.tempParams.adults;
|
|
44
|
+
}
|
|
45
|
+
set children(value) {
|
|
46
|
+
this.tempParams.adults = value;
|
|
47
|
+
this._isValid();
|
|
48
|
+
}
|
|
49
|
+
get date() {
|
|
50
|
+
return this._date;
|
|
51
|
+
}
|
|
52
|
+
set date(value) {
|
|
53
|
+
this._date = value;
|
|
54
|
+
this._updateDateTime();
|
|
55
|
+
}
|
|
56
|
+
get time() {
|
|
57
|
+
return this._time;
|
|
58
|
+
}
|
|
59
|
+
set time(value) {
|
|
60
|
+
this._time = value;
|
|
61
|
+
this._updateDateTime();
|
|
62
|
+
}
|
|
63
|
+
get arrivalDatetime() {
|
|
64
|
+
return this.tempParams.arrivalDatetime;
|
|
65
|
+
}
|
|
66
|
+
set arrivalDatetime(value) {
|
|
67
|
+
if (value.isValid()) {
|
|
68
|
+
this.tempParams.arrivalDatetime = value;
|
|
69
|
+
this._date = this.helpers.momentToNgDate(value);
|
|
70
|
+
this._time = this.helpers.formatTimeColon(value);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.tempParams.arrivalDatetime = null;
|
|
74
|
+
}
|
|
75
|
+
this._isValid();
|
|
76
|
+
}
|
|
77
|
+
_updateDateTime() {
|
|
78
|
+
if (this._date && this._time) {
|
|
79
|
+
const time = this.helpers.ngDateToMoment(this._date, this._time);
|
|
80
|
+
this.tempParams.arrivalDatetime = time.isValid() ? time : null;
|
|
81
|
+
this._isValid();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
get locationCode() {
|
|
85
|
+
return this.tempParams.locationCode;
|
|
86
|
+
}
|
|
87
|
+
set locationCode(value) {
|
|
88
|
+
this.tempParams.locationCode = value;
|
|
89
|
+
if (typeof value === 'string') {
|
|
90
|
+
this._locationCode = '';
|
|
91
|
+
this._isValid();
|
|
92
|
+
}
|
|
93
|
+
else if (value && value.gateway) {
|
|
94
|
+
this._locationCode = value.gateway;
|
|
95
|
+
this._isValid();
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this._locationCode = null;
|
|
99
|
+
this._isValid();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
_isValid() {
|
|
103
|
+
if (!this.doChecks) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.storageService.setSessionItem(FastTrackEnterpriseSearch.STORAGE_SESSION_PARAMS, {
|
|
107
|
+
tempParams: this.tempParams,
|
|
108
|
+
originalUserSearch: this.originalUserSearch
|
|
109
|
+
});
|
|
110
|
+
this.validationMessages = [];
|
|
111
|
+
if (!this.locationCode) {
|
|
112
|
+
this.validationMessages.push('Please add in a airport location');
|
|
113
|
+
}
|
|
114
|
+
if (!this.tempParams.arrivalDatetime.isAfter(moment())) {
|
|
115
|
+
this.validationMessages.push('Departure date can not be in the past');
|
|
116
|
+
}
|
|
117
|
+
this.isValid.next(this.validationMessages.length === 0);
|
|
118
|
+
this.messages.next(this.validationMessages);
|
|
119
|
+
}
|
|
120
|
+
resetQuery() {
|
|
121
|
+
this.updateTempParams(this.searchService.makeFastTrackQuery());
|
|
122
|
+
this._isValid();
|
|
123
|
+
}
|
|
124
|
+
startSearch() {
|
|
125
|
+
this.results.next([]);
|
|
126
|
+
this._isValid();
|
|
127
|
+
if (this.isValid.value) {
|
|
128
|
+
this._originalUserSearch = Object.freeze(this.helpers.clone(this.tempParams));
|
|
129
|
+
this.storageService.setSessionItem(FastTrackEnterpriseSearch.STORAGE_SESSION_PARAMS, {
|
|
130
|
+
tempParams: this.tempParams,
|
|
131
|
+
originalUserSearch: this.originalUserSearch
|
|
132
|
+
});
|
|
133
|
+
const query = this.getSearchQuery();
|
|
134
|
+
this.searchService.saveRecentSearch(this.getRecentSearchQuery(query));
|
|
135
|
+
return this._startSearch(this.fasttrackFetcher.fetchList(query));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
return Promise.resolve(false);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
getSearchQuery() {
|
|
142
|
+
const query = {
|
|
143
|
+
adults: this.tempParams.adults,
|
|
144
|
+
children: this.tempParams.children,
|
|
145
|
+
locationCode: this._locationCode,
|
|
146
|
+
arrivalDatetime: this.tempParams.arrivalDatetime
|
|
147
|
+
};
|
|
148
|
+
return this.helpers.removeNulls(query);
|
|
149
|
+
}
|
|
150
|
+
getRecentSearchQuery(query) {
|
|
151
|
+
return {
|
|
152
|
+
serviceType: ServiceType.FastTrack,
|
|
153
|
+
searchArgs: query,
|
|
154
|
+
travelDate: this.arrivalDatetime.format(),
|
|
155
|
+
travellers: this.helpers.getTravellersId(this.travellers)
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
startRecentSearch(recentSearch) {
|
|
159
|
+
this.arrivalDatetime = moment(recentSearch.searchArgs.arrivalDatetime);
|
|
160
|
+
this.searchService
|
|
161
|
+
.getAirportByCode(recentSearch.searchArgs.locationCode)
|
|
162
|
+
.subscribe((airport) => {
|
|
163
|
+
var _a, _b, _c, _d, _e, _f;
|
|
164
|
+
if (airport) {
|
|
165
|
+
this.locationCode = {
|
|
166
|
+
country: (_b = (_a = airport.iataMatch) === null || _a === void 0 ? void 0 : _a.locationDetails) === null || _b === void 0 ? void 0 : _b.country,
|
|
167
|
+
countryCode: (_d = (_c = airport.iataMatch) === null || _c === void 0 ? void 0 : _c.locationDetails) === null || _d === void 0 ? void 0 : _d.countryCode,
|
|
168
|
+
destination: airport.iataMatch.name,
|
|
169
|
+
gateway: airport.iataMatch.iata,
|
|
170
|
+
postcode: (_f = (_e = airport.iataMatch) === null || _e === void 0 ? void 0 : _e.locationDetails) === null || _f === void 0 ? void 0 : _f.postcode,
|
|
171
|
+
terminals: this.searchService.processTerminals(airport.iataMatch.terminals)
|
|
172
|
+
};
|
|
173
|
+
this.searchService.startSearches();
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
this.searchService.startSearches();
|
|
177
|
+
}
|
|
178
|
+
updateFromPreviousSearches(previousItems) {
|
|
179
|
+
var _a;
|
|
180
|
+
console.log('PREPOPULATING LOUNGE FORM');
|
|
181
|
+
const flightItem = (_a = previousItems[ServiceType.Flight]) === null || _a === void 0 ? void 0 : _a.searchQuery;
|
|
182
|
+
if (flightItem) {
|
|
183
|
+
try {
|
|
184
|
+
const date = this.searchService.searches[ServiceType.Flight].outBoundDate.toDate();
|
|
185
|
+
this.date = {
|
|
186
|
+
day: date.getUTCDate(),
|
|
187
|
+
month: date.getUTCMonth() + 1,
|
|
188
|
+
year: date.getUTCFullYear()
|
|
189
|
+
};
|
|
190
|
+
this.locationCode = this.searchService.searches[ServiceType.Flight]
|
|
191
|
+
.arriveLocation;
|
|
192
|
+
}
|
|
193
|
+
catch (_b) {
|
|
194
|
+
console.error('Error trying to prepopulate parking from lounge item');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
updateLowestPrice(results) {
|
|
199
|
+
if (!results.length)
|
|
200
|
+
return null;
|
|
201
|
+
const currency = results[0].currency;
|
|
202
|
+
return results.reduce((cheapestPrice, result) => {
|
|
203
|
+
const price = result.price;
|
|
204
|
+
if (cheapestPrice.amount > price)
|
|
205
|
+
cheapestPrice.amount = price;
|
|
206
|
+
return cheapestPrice;
|
|
207
|
+
}, { amount: Number.MAX_SAFE_INTEGER, currencyCode: currency });
|
|
208
|
+
}
|
|
209
|
+
addFastTrackToBasket(fasttrackQuote, fasttrackQuery) {
|
|
210
|
+
var _a;
|
|
211
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
212
|
+
if (fasttrackQuote.unavailable) {
|
|
213
|
+
return Promise.resolve(false);
|
|
214
|
+
}
|
|
215
|
+
const intBasket = yield this.basketService.getDefaultBasket();
|
|
216
|
+
const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
|
|
217
|
+
const termsAndConditions = this.getTermsAndCond(fasttrackQuote);
|
|
218
|
+
if (basket) {
|
|
219
|
+
return this.basketService.addToBasket({
|
|
220
|
+
adults: fasttrackQuery.adults,
|
|
221
|
+
children: fasttrackQuery.children,
|
|
222
|
+
basket: basket.id,
|
|
223
|
+
service: fasttrackQuote.sourceId.toString(),
|
|
224
|
+
detail: {
|
|
225
|
+
arrivalDatetime: fasttrackQuery.arrivalDatetime.format(),
|
|
226
|
+
locationCode: fasttrackQuote.code,
|
|
227
|
+
name: fasttrackQuote.name,
|
|
228
|
+
airportIata: fasttrackQuery === null || fasttrackQuery === void 0 ? void 0 : fasttrackQuery.locationCode,
|
|
229
|
+
logo: fasttrackQuote.logo,
|
|
230
|
+
terminal: (_a = fasttrackQuote.terminal) === null || _a === void 0 ? void 0 : _a.toString(),
|
|
231
|
+
termsAndCond: termsAndConditions
|
|
232
|
+
},
|
|
233
|
+
price: fasttrackQuote.price,
|
|
234
|
+
currency: fasttrackQuote.currency,
|
|
235
|
+
searchQuery: fasttrackQuery,
|
|
236
|
+
outboundDate: fasttrackQuery.arrivalDatetime.format()
|
|
237
|
+
}, intBasket, this.searchService, this.travellers, fasttrackQuote.requiresReason);
|
|
238
|
+
}
|
|
239
|
+
return Promise.resolve(false); // TODO should this throw an error?
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
getTermsAndCond(fasttrackQuote) {
|
|
243
|
+
return [
|
|
244
|
+
{
|
|
245
|
+
name: 'Name',
|
|
246
|
+
value: fasttrackQuote.name
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
name: 'Important Information',
|
|
250
|
+
value: fasttrackQuote.importantInfo
|
|
251
|
+
}
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
applyFilters(appliedFilters, selectedSort) {
|
|
255
|
+
let fullResults = this.helpers.clone(this.fullResults);
|
|
256
|
+
fullResults = fullResults.filter((result) => {
|
|
257
|
+
return (result.price >= appliedFilters.minPrice &&
|
|
258
|
+
result.price <= appliedFilters.maxPrice);
|
|
259
|
+
});
|
|
260
|
+
fullResults = this.sortResults(selectedSort, fullResults);
|
|
261
|
+
this.results.next(fullResults);
|
|
262
|
+
}
|
|
263
|
+
sortResults(selectedSort, results) {
|
|
264
|
+
let fullResults = this.helpers.clone(results ? results : this.results.value);
|
|
265
|
+
switch (selectedSort) {
|
|
266
|
+
case 0: // cheapest
|
|
267
|
+
fullResults = fullResults.sort((a, b) => a.price - b.price);
|
|
268
|
+
break;
|
|
269
|
+
case 1: // expensive
|
|
270
|
+
fullResults = fullResults.sort((a, b) => b.price - a.price);
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
// fallback to whatever was before
|
|
274
|
+
this.results.next(fullResults);
|
|
275
|
+
return fullResults;
|
|
276
|
+
}
|
|
277
|
+
getMinPrice(fts) {
|
|
278
|
+
return fts.reduce((min, ft) => {
|
|
279
|
+
if (ft.price < min) {
|
|
280
|
+
min = ft.price;
|
|
281
|
+
}
|
|
282
|
+
return min;
|
|
283
|
+
}, Number.MAX_SAFE_INTEGER);
|
|
284
|
+
}
|
|
285
|
+
getMaxPrice(fts) {
|
|
286
|
+
return fts.reduce((max, ft) => {
|
|
287
|
+
if (ft.price > max) {
|
|
288
|
+
max = ft.price;
|
|
289
|
+
}
|
|
290
|
+
return max;
|
|
291
|
+
}, Number.MIN_SAFE_INTEGER);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
FastTrackEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_fasttrack';
|
|
295
|
+
FastTrackEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_fasttrack';
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdC10cmFjay1lbnRlcnByaXNlLXNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3IvY2xhc3Nlcy9mYXN0LXRyYWNrLWVudGVycHJpc2Utc2VhcmNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFtQjVCLE9BQU8sRUFRTCxXQUFXLEVBQ1osTUFBTSx3QkFBd0IsQ0FBQztBQVNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxNQUFNLE9BQU8seUJBQ1gsU0FBUSxvQkFJUDtJQTBIRCxZQUNVLGdCQUFrRCxFQUMxRCxPQUEyQixFQUNuQixhQUErQyxFQUN2RCxjQUFrQyxFQUMxQixhQUErQztRQUV2RCxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBTnZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0M7UUFFbEQsa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBRS9DLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQTFIbEQsU0FBSSxHQUFnQixXQUFXLENBQUMsU0FBUyxDQUFDO1FBdUJ6QyxVQUFLLEdBQWtCLElBQUksQ0FBQztRQVU1QixVQUFLLEdBQVcsSUFBSSxDQUFDO1FBK0VuQix1QkFBa0IsR0FDMUIseUJBQXlCLENBQUMsdUJBQXVCLENBQUM7UUFDMUMsNEJBQXVCLEdBQy9CLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDO1FBVWxELE1BQU0sSUFBSSxHQUdOLGNBQWMsQ0FBQyxjQUFjLENBQy9CLHlCQUF5QixDQUFDLHNCQUFzQixDQUNqRCxJQUFJO1lBQ0gsVUFBVSxFQUFFLEVBQXlCO1lBQ3JDLGtCQUFrQixFQUFFLEVBQXlCO1NBQzlDLENBQUM7UUFDRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFD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QUFHLGtCQUFrQixDQUFDO0FBQzVDLGlEQUF1QixHQUFHLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBCYXNlRmFzdFRyYWNrUXVvdGVGZXRjaGVyLFxyXG4gIEZhc3RUcmFja1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9mYXN0LXRyYWNrLXF1b3RlLmZldGNoZXInO1xyXG5pbXBvcnQgeyBJQ2hlYXBlc3RQcmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlYXBlc3QtcHJpY2UnO1xyXG5pbXBvcnQgeyBGYXN0VHJhY2tGaWx0ZXJzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mYXN0LXRyYWNrLWZpbHRlcnMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgRmFzdFRyYWNrVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWZhc3QtdHJhY2stZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhdmVsbGVyIH0gZnJvbSAnLi4vbW9kZWxzL3RyYXZlbGxlci5vYmplY3QnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEFpcnBvcnRSZXN1bHRzLFxyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ3VycmVuY3lDb2RlLFxyXG4gIEZhc3RUcmFja1F1b3RlLFxyXG4gIFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyxcclxuICBTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlcyxcclxuICBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEZhc3RUcmFja1F1b3RlUmVzdWx0LFxyXG4gIEZhc3RUcmFja1F1b3RlUmVzdWx0QXJyYXksXHJcbiAgTmdiRGF0ZVN0cnVjdCxcclxuICBPQlRBaXJwb3J0RGV0YWlscyxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgVGVybWluYWxzVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaDxGVFFfUSBleHRlbmRzIEZhc3RUcmFja1F1b3RlRmV0Y2hlclR5cGU+XHJcbiAgZXh0ZW5kcyBCYXNlRW50ZXJwcmlzZVNlYXJjaDxcclxuICAgIEZhc3RUcmFja1RlbXBQYXJhbXMsXHJcbiAgICBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5LFxyXG4gICAgRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2hJbnRlcmZhY2Vcclxue1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUEFSQU1TID0gJ3NlYXJjaF9mYXN0dHJhY2snO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUkVTVUxUUyA9ICdyZXN1bHRzX2Zhc3R0cmFjayc7XHJcbiAgcHVibGljIHR5cGU6IFNlcnZpY2VUeXBlID0gU2VydmljZVR5cGUuRmFzdFRyYWNrO1xyXG5cclxuICBwcml2YXRlIF9sb2NhdGlvbkNvZGU6IHN0cmluZztcclxuICBwcml2YXRlIHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdO1xyXG5cclxuICBnZXQgYWR1bHRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFkdWx0cztcclxuICB9XHJcblxyXG4gIHNldCBhZHVsdHModmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoaWxkcmVuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFkdWx0cztcclxuICB9XHJcblxyXG4gIHNldCBjaGlsZHJlbih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuICBnZXQgZGF0ZSgpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2RhdGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZURhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90aW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCB0aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGltZTtcclxuICB9XHJcblxyXG4gIHNldCB0aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3RpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZURhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXJyaXZhbERhdGV0aW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsRGF0ZXRpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgYXJyaXZhbERhdGV0aW1lKHZhbHVlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICBpZiAodmFsdWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsRGF0ZXRpbWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgIHRoaXMuX2RhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUodmFsdWUpO1xyXG4gICAgICB0aGlzLl90aW1lID0gdGhpcy5oZWxwZXJzLmZvcm1hdFRpbWVDb2xvbih2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZURhdGVUaW1lKCkge1xyXG4gICAgaWYgKHRoaXMuX2RhdGUgJiYgdGhpcy5fdGltZSkge1xyXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHRoaXMuX2RhdGUsIHRoaXMuX3RpbWUpO1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lID0gdGltZS5pc1ZhbGlkKCkgPyB0aW1lIDogbnVsbDtcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxvY2F0aW9uQ29kZSgpOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uQ29kZTtcclxuICB9XHJcblxyXG4gIHNldCBsb2NhdGlvbkNvZGUodmFsdWU6IHN0cmluZyB8IE9CVEFpcnBvcnREZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25Db2RlID0gdmFsdWU7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbkNvZGUgPSAnJztcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5nYXRld2F5KSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IHZhbHVlLmdhdGV3YXk7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmFsaWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZG9DaGVja3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtcyxcclxuICAgICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICBpZiAoIXRoaXMubG9jYXRpb25Db2RlKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBhZGQgaW4gYSBhaXJwb3J0IGxvY2F0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lLmlzQWZ0ZXIobW9tZW50KCkpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ0RlcGFydHVyZSBkYXRlIGNhbiBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzVmFsaWQubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDApO1xyXG4gICAgdGhpcy5tZXNzYWdlcy5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuICBwcm90ZWN0ZWQgbXVsdGlSZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZhc3R0cmFja0ZldGNoZXI6IEJhc2VGYXN0VHJhY2tRdW90ZUZldGNoZXI8RlRRX1E+LFxyXG4gICAgaGVscGVyczogQmFzZUhlbHBlclJvdXRpbmVzLFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHN0b3JhZ2VTZXJ2aWNlOiBCYXNlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihzdG9yYWdlU2VydmljZSwgaGVscGVycyk7XHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEZhc3RUcmFja1RlbXBQYXJhbXM7XHJcbiAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogRmFzdFRyYWNrVGVtcFBhcmFtcztcclxuICAgIH0gPSBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShcclxuICAgICAgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgdGVtcFBhcmFtczoge30gYXMgRmFzdFRyYWNrVGVtcFBhcmFtcyxcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB7fSBhcyBGYXN0VHJhY2tUZW1wUGFyYW1zXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fb3JpZ2luYWxVc2VyU2VhcmNoID0gZGF0YS5vcmlnaW5hbFVzZXJTZWFyY2g7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlRmFzdFRyYWNrUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcblxyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5GYXN0VHJhY2tcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHNwbGl0VHJhdmVsbGVycy5hZHVsdHMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gc3BsaXRUcmF2ZWxsZXJzLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcblxyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RSZXN1bHRQcmljZSA9IHRoaXMudXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0cyk7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzIHx8IFtdKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCkge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlRmFzdFRyYWNrUXVlcnkoKSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IE9iamVjdC5mcmVlemUoXHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmNsb25lKHRoaXMudGVtcFBhcmFtcylcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgICBGYXN0VHJhY2tFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcFBhcmFtczogdGhpcy50ZW1wUGFyYW1zLFxyXG4gICAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZVJlY2VudFNlYXJjaCh0aGlzLmdldFJlY2VudFNlYXJjaFF1ZXJ5KHF1ZXJ5KSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydFNlYXJjaCh0aGlzLmZhc3R0cmFja0ZldGNoZXIuZmV0Y2hMaXN0KHF1ZXJ5KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFF1ZXJ5KCk6IFNlYXJjaEZhc3RUcmFja1F1ZXJ5VmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlcyA9IHtcclxuICAgICAgYWR1bHRzOiB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzLFxyXG4gICAgICBjaGlsZHJlbjogdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuLFxyXG4gICAgICBsb2NhdGlvbkNvZGU6IHRoaXMuX2xvY2F0aW9uQ29kZSxcclxuICAgICAgYXJyaXZhbERhdGV0aW1lOiB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5yZW1vdmVOdWxsczxTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlcz4ocXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVjZW50U2VhcmNoUXVlcnkoXHJcbiAgICBxdWVyeTogU2VhcmNoRmFzdFRyYWNrUXVlcnlWYXJpYWJsZXNcclxuICApOiBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLkZhc3RUcmFjayxcclxuICAgICAgc2VhcmNoQXJnczogcXVlcnksXHJcbiAgICAgIHRyYXZlbERhdGU6IHRoaXMuYXJyaXZhbERhdGV0aW1lLmZvcm1hdCgpLFxyXG4gICAgICB0cmF2ZWxsZXJzOiB0aGlzLmhlbHBlcnMuZ2V0VHJhdmVsbGVyc0lkKHRoaXMudHJhdmVsbGVycylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRSZWNlbnRTZWFyY2gocmVjZW50U2VhcmNoOiBSZWNlbnRTZWFyY2gpOiB2b2lkIHtcclxuICAgIHRoaXMuYXJyaXZhbERhdGV0aW1lID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmFycml2YWxEYXRldGltZSk7XHJcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgLmdldEFpcnBvcnRCeUNvZGUocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9jYXRpb25Db2RlKVxyXG4gICAgICAuc3Vic2NyaWJlKChhaXJwb3J0OiBBaXJwb3J0UmVzdWx0cykgPT4ge1xyXG4gICAgICAgIGlmIChhaXJwb3J0KSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uQ29kZSA9IHtcclxuICAgICAgICAgICAgY291bnRyeTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8uY291bnRyeSxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogYWlycG9ydC5pYXRhTWF0Y2gubmFtZSxcclxuICAgICAgICAgICAgZ2F0ZXdheTogYWlycG9ydC5pYXRhTWF0Y2guaWF0YSxcclxuICAgICAgICAgICAgcG9zdGNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICB0ZXJtaW5hbHM6IHRoaXMuc2VhcmNoU2VydmljZS5wcm9jZXNzVGVybWluYWxzKFxyXG4gICAgICAgICAgICAgIGFpcnBvcnQuaWF0YU1hdGNoLnRlcm1pbmFsc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUZyb21QcmV2aW91c1NlYXJjaGVzKFxyXG4gICAgcHJldmlvdXNJdGVtczogUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPlxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ1BSRVBPUFVMQVRJTkcgTE9VTkdFIEZPUk0nKTtcclxuICAgIGNvbnN0IGZsaWdodEl0ZW06IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5GbGlnaHRdPy5zZWFyY2hRdWVyeTtcclxuICAgIGlmIChmbGlnaHRJdGVtKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5vdXRCb3VuZERhdGUudG9EYXRlKCk7XHJcbiAgICAgICAgdGhpcy5kYXRlID0ge1xyXG4gICAgICAgICAgZGF5OiBkYXRlLmdldFVUQ0RhdGUoKSxcclxuICAgICAgICAgIG1vbnRoOiBkYXRlLmdldFVUQ01vbnRoKCkgKyAxLFxyXG4gICAgICAgICAgeWVhcjogZGF0ZS5nZXRVVENGdWxsWWVhcigpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uQ29kZSA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdXHJcbiAgICAgICAgICAuYXJyaXZlTG9jYXRpb24gYXMgT0JUQWlycG9ydERldGFpbHM7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwcmVwb3B1bGF0ZSBwYXJraW5nIGZyb20gbG91bmdlIGl0ZW0nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0czogRmFzdFRyYWNrUXVvdGVbXSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgY3VycmVuY3kgPSByZXN1bHRzWzBdLmN1cnJlbmN5O1xyXG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKFxyXG4gICAgICAoY2hlYXBlc3RQcmljZTogSUNoZWFwZXN0UHJpY2UsIHJlc3VsdDogRmFzdFRyYWNrUXVvdGUpID0+IHtcclxuICAgICAgICBjb25zdCBwcmljZSA9IHJlc3VsdC5wcmljZTtcclxuICAgICAgICBpZiAoY2hlYXBlc3RQcmljZS5hbW91bnQgPiBwcmljZSkgY2hlYXBlc3RQcmljZS5hbW91bnQgPSBwcmljZTtcclxuICAgICAgICByZXR1cm4gY2hlYXBlc3RQcmljZTtcclxuICAgICAgfSxcclxuICAgICAgeyBhbW91bnQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBjdXJyZW5jeUNvZGU6IGN1cnJlbmN5IH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRGYXN0VHJhY2tUb0Jhc2tldChcclxuICAgIGZhc3R0cmFja1F1b3RlOiBGYXN0VHJhY2tRdW90ZSxcclxuICAgIGZhc3R0cmFja1F1ZXJ5OiBTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGZhc3R0cmFja1F1b3RlLnVuYXZhaWxhYmxlKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5nZXREZWZhdWx0QmFza2V0KCk7XHJcbiAgICBjb25zdCBiYXNrZXQgPSBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWU7XHJcbiAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChmYXN0dHJhY2tRdW90ZSk7XHJcbiAgICBpZiAoYmFza2V0KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYWR1bHRzOiBmYXN0dHJhY2tRdWVyeS5hZHVsdHMsXHJcbiAgICAgICAgICBjaGlsZHJlbjogZmFzdHRyYWNrUXVlcnkuY2hpbGRyZW4sXHJcbiAgICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICAgIHNlcnZpY2U6IGZhc3R0cmFja1F1b3RlLnNvdXJjZUlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgYXJyaXZhbERhdGV0aW1lOiBmYXN0dHJhY2tRdWVyeS5hcnJpdmFsRGF0ZXRpbWUuZm9ybWF0KCksXHJcbiAgICAgICAgICAgIGxvY2F0aW9uQ29kZTogZmFzdHRyYWNrUXVvdGUuY29kZSxcclxuICAgICAgICAgICAgbmFtZTogZmFzdHRyYWNrUXVvdGUubmFtZSxcclxuICAgICAgICAgICAgYWlycG9ydElhdGE6IGZhc3R0cmFja1F1ZXJ5Py5sb2NhdGlvbkNvZGUsXHJcbiAgICAgICAgICAgIGxvZ286IGZhc3R0cmFja1F1b3RlLmxvZ28sXHJcbiAgICAgICAgICAgIHRlcm1pbmFsOiBmYXN0dHJhY2tRdW90ZS50ZXJtaW5hbD8udG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgdGVybXNBbmRDb25kOiB0ZXJtc0FuZENvbmRpdGlvbnNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcmljZTogZmFzdHRyYWNrUXVvdGUucHJpY2UsXHJcbiAgICAgICAgICBjdXJyZW5jeTogZmFzdHRyYWNrUXVvdGUuY3VycmVuY3kgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgICAgc2VhcmNoUXVlcnk6IGZhc3R0cmFja1F1ZXJ5LFxyXG4gICAgICAgICAgb3V0Ym91bmREYXRlOiBmYXN0dHJhY2tRdWVyeS5hcnJpdmFsRGF0ZXRpbWUuZm9ybWF0KClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGludEJhc2tldCxcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAgICAgdGhpcy50cmF2ZWxsZXJzLFxyXG4gICAgICAgIGZhc3R0cmFja1F1b3RlLnJlcXVpcmVzUmVhc29uXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgLy8gVE9ETyBzaG91bGQgdGhpcyB0aHJvdyBhbiBlcnJvcj9cclxuICAgIH1cclxuICBcclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKGZhc3R0cmFja1F1b3RlOiBGYXN0VHJhY2tRdW90ZSkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdOYW1lJyxcclxuICAgICAgICB2YWx1ZTogZmFzdHRyYWNrUXVvdGUubmFtZVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0ltcG9ydGFudCBJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGZhc3R0cmFja1F1b3RlLmltcG9ydGFudEluZm9cclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycyhhcHBsaWVkRmlsdGVyczogRmFzdFRyYWNrRmlsdGVycywgc2VsZWN0ZWRTb3J0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBmdWxsUmVzdWx0czogRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheSA9IHRoaXMuaGVscGVycy5jbG9uZShcclxuICAgICAgdGhpcy5mdWxsUmVzdWx0c1xyXG4gICAgKTtcclxuXHJcbiAgICBmdWxsUmVzdWx0cyA9IGZ1bGxSZXN1bHRzLmZpbHRlcigocmVzdWx0OiBGYXN0VHJhY2tRdW90ZVJlc3VsdCkgPT4ge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHJlc3VsdC5wcmljZSA+PSBhcHBsaWVkRmlsdGVycy5taW5QcmljZSAmJlxyXG4gICAgICAgIHJlc3VsdC5wcmljZSA8PSBhcHBsaWVkRmlsdGVycy5tYXhQcmljZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVsbFJlc3VsdHMgPSB0aGlzLnNvcnRSZXN1bHRzKHNlbGVjdGVkU29ydCwgZnVsbFJlc3VsdHMpO1xyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KGZ1bGxSZXN1bHRzKTtcclxuICB9XHJcblxyXG4gIHNvcnRSZXN1bHRzKFxyXG4gICAgc2VsZWN0ZWRTb3J0OiBudW1iZXIsXHJcbiAgICByZXN1bHRzPzogRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheVxyXG4gICk6IEZhc3RUcmFja1F1b3RlUmVzdWx0QXJyYXkge1xyXG4gICAgbGV0IGZ1bGxSZXN1bHRzID0gdGhpcy5oZWxwZXJzLmNsb25lKFxyXG4gICAgICByZXN1bHRzID8gcmVzdWx0cyA6IHRoaXMucmVzdWx0cy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHN3aXRjaCAoc2VsZWN0ZWRTb3J0KSB7XHJcbiAgICAgIGNhc2UgMDogLy8gY2hlYXBlc3RcclxuICAgICAgICBmdWxsUmVzdWx0cyA9IGZ1bGxSZXN1bHRzLnNvcnQoXHJcbiAgICAgICAgICAoYTogRmFzdFRyYWNrUXVvdGVSZXN1bHQsIGI6IEZhc3RUcmFja1F1b3RlUmVzdWx0KSA9PlxyXG4gICAgICAgICAgICBhLnByaWNlIC0gYi5wcmljZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMTogLy8gZXhwZW5zaXZlXHJcbiAgICAgICAgZnVsbFJlc3VsdHMgPSBmdWxsUmVzdWx0cy5zb3J0KFxyXG4gICAgICAgICAgKGE6IEZhc3RUcmFja1F1b3RlUmVzdWx0LCBiOiBGYXN0VHJhY2tRdW90ZVJlc3VsdCkgPT5cclxuICAgICAgICAgICAgYi5wcmljZSAtIGEucHJpY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIHRvIHdoYXRldmVyIHdhcyBiZWZvcmVcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KGZ1bGxSZXN1bHRzKTtcclxuICAgIHJldHVybiBmdWxsUmVzdWx0cztcclxuICB9XHJcblxyXG4gIGdldE1pblByaWNlKGZ0czogRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZnRzLnJlZHVjZSgobWluOiBudW1iZXIsIGZ0OiBGYXN0VHJhY2tRdW90ZVJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAoZnQucHJpY2UgPCBtaW4pIHtcclxuICAgICAgICBtaW4gPSBmdC5wcmljZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbWluO1xyXG4gICAgfSwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4UHJpY2UoZnRzOiBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBmdHMucmVkdWNlKChtYXg6IG51bWJlciwgZnQ6IEZhc3RUcmFja1F1b3RlUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChmdC5wcmljZSA+IG1heCkge1xyXG4gICAgICAgIG1heCA9IGZ0LnByaWNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtYXg7XHJcbiAgICB9LCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUik7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|