@sabstravtech/obtservices 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/obtservices/angular/components/basket-panel.d.ts +34 -0
- package/dist/obtservices/angular/components/with-component.d.ts +12 -0
- package/dist/obtservices/angular/data.d.ts +5530 -0
- package/dist/obtservices/angular/fetchers.d.ts +32 -0
- package/dist/obtservices/angular/lib/vendor/classes/environment.d.ts +3 -0
- package/dist/obtservices/angular/lib/vendor/classes/event-messenager.d.ts +4 -0
- package/dist/obtservices/angular/lib/vendor/classes/helpers.d.ts +15 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/basket-fetcher.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/cabhire-quote-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/carhire-availability-detail.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/carhire-quote-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/conferma-office-names.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/conferma-quicklist.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/eurostar-quote.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/flight-quote.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/get-rail-cards.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/get-rail-station.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/get-risk-alerts.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/get-user-company-offices.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/get-user-recent-searches.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/get-users-baskets-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/getMiAutoSugestions.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/hotel-avaliability-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/hotel-quote-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/irl-quote-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/lounge-quote.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/parking-quote-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/rail-quote-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-airlines-fetcher.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-airports-fetcher.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-cities.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-depots.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-hotel-chains.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-postcodes.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-rail-stations.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/search-users-can-book-for-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/user-addresses.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/user-fetcher.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/user-message.fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/user-products-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/fetchers/user-ui-configs-fetcher.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/services/enterprise-basket.service.d.ts +29 -0
- package/dist/obtservices/angular/lib/vendor/services/hotel-avallibility.service.d.ts +9 -0
- package/dist/obtservices/angular/lib/vendor/services/http-call.service.d.ts +48 -0
- package/dist/obtservices/angular/lib/vendor/services/logon.service.d.ts +18 -0
- package/dist/obtservices/angular/lib/vendor/services/modal-opener.service.d.ts +4 -0
- package/dist/obtservices/angular/lib/vendor/services/my-bookings.service.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/services/route-happy.service.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/services/search.service.d.ts +47 -0
- package/dist/obtservices/angular/lib/vendor/services/storage.service.d.ts +18 -0
- package/dist/obtservices/angular/lib/vendor/services/user.service.d.ts +10 -0
- package/dist/obtservices/angular/lib/vendor/services/webtoken.service.d.ts +7 -0
- package/dist/obtservices/angular/lib/vendor/testers/postcode-validate.tester.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/testers/validate-mi-free-value.tester.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/types/graphql.angular.types.d.ts +5915 -0
- package/dist/obtservices/angular/lib/vendor/updaters/accept-new-price.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/add-item-to-basket.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/addUserToBasketItem.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/book-basket-updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/create-basket-updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/move-basket-item-to-basket.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/remove-basket-updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/remove-item-from-basket.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/remove-recent-search.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/remove-user-address.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/revalidate-basket-updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/save-recent-search.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/save-user-address.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/send-basket-for-approval.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/set-basket-item-lead-passenger.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/set-basket-item-mi-group.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/set-basket-item-mi-value-updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/set-payment-option.updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/update-basket-notes-updater.d.ts +6 -0
- package/dist/obtservices/angular/lib/vendor/updaters/update-basket-title-updater.d.ts +6 -0
- package/dist/obtservices/angular/obtservices-angular.d.ts +17 -0
- package/dist/obtservices/angular/obtservices-angular.metadata.json +1 -0
- package/dist/obtservices/angular/obtservices.module.d.ts +7 -0
- package/dist/obtservices/angular/package.json +11 -0
- package/dist/obtservices/base/fetchers.d.ts +36 -0
- package/dist/obtservices/base/lib/vendor/classes/base-enterprise.d.ts +39 -0
- package/dist/obtservices/base/lib/vendor/classes/base-network-call.d.ts +10 -0
- package/dist/obtservices/base/lib/vendor/classes/basket-info-mi-details.impl.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/classes/bookable-basket.d.ts +40 -0
- package/dist/obtservices/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +138 -0
- package/dist/obtservices/base/lib/vendor/classes/carhire-enterprise-search.d.ts +203 -0
- package/dist/obtservices/base/lib/vendor/classes/enviroment.d.ts +24 -0
- package/dist/obtservices/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +268 -0
- package/dist/obtservices/base/lib/vendor/classes/eurostar-search-type.enum.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/classes/event-messenager.d.ts +12 -0
- package/dist/obtservices/base/lib/vendor/classes/flight-enterprise-search.d.ts +251 -0
- package/dist/obtservices/base/lib/vendor/classes/flight-search-type.enum.d.ts +5 -0
- package/dist/obtservices/base/lib/vendor/classes/helpers.d.ts +173 -0
- package/dist/obtservices/base/lib/vendor/classes/hotel-enterprise-search.d.ts +176 -0
- package/dist/obtservices/base/lib/vendor/classes/irl-enterprise-search.d.ts +139 -0
- package/dist/obtservices/base/lib/vendor/classes/limited-cache.class.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/classes/lounges-enterprise-search.d.ts +68 -0
- package/dist/obtservices/base/lib/vendor/classes/management-info-and-valid.d.ts +41 -0
- package/dist/obtservices/base/lib/vendor/classes/modal-types.enum.d.ts +12 -0
- package/dist/obtservices/base/lib/vendor/classes/parking-enterprise-search.d.ts +103 -0
- package/dist/obtservices/base/lib/vendor/classes/rail-direction.enum.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/classes/rail-enterprise-search.d.ts +193 -0
- package/dist/obtservices/base/lib/vendor/classes/routehappy-request.d.ts +126 -0
- package/dist/obtservices/base/lib/vendor/classes/routehappy-response.d.ts +107 -0
- package/dist/obtservices/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +62 -0
- package/dist/obtservices/base/lib/vendor/classes/user-favourite.enum.d.ts +12 -0
- package/dist/obtservices/base/lib/vendor/classes/validator.checker.d.ts +6 -0
- package/dist/obtservices/base/lib/vendor/fetchers/basket-fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/cabhire-quote-fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/carhire-availability-detail.fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/carhire-quote-fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/conferma-office-names.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/conferma-quicklist.fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/eurostar-quote.fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/get-rail-cards.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/get-rail-station.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/get-risk-alerts.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/get-user-company-offices.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/get-user-recent-searches.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/get-users-baskets-fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/getMiAutoSugestions.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/hotel-avaliability-fetcher.d.ts +24 -0
- package/dist/obtservices/base/lib/vendor/fetchers/hotel-quote-fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/irl-quote-fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/list-fetchable-enterprise.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/lounge-quote.fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/object-fetchable-enterprise.d.ts +11 -0
- package/dist/obtservices/base/lib/vendor/fetchers/parking-quote-fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/rail-quote-fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-airlines.fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-airports-fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-cities.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-depots.fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-hotel-chains.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-postcodes.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-rail-stations.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/user-addresses.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/user-fetcher.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/fetchers/user-message.fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/user-products-fetcher.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/fetchers/user-ui-configs-fetcher.d.ts +23 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +133 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +99 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +64 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +124 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +123 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +192 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +45 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +36 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Imybookings.service.d.ts +24 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +58 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +110 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Isearch.service.d.ts +101 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +42 -0
- package/dist/obtservices/base/lib/vendor/interfaces/Iuser.service.d.ts +59 -0
- package/dist/obtservices/base/lib/vendor/interfaces/car-hire-classes.interface.d.ts +7 -0
- package/dist/obtservices/base/lib/vendor/interfaces/car-hire-filters.interface.d.ts +10 -0
- package/dist/obtservices/base/lib/vendor/interfaces/car-hire-sort.interface.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/interfaces/cheapest-price.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/interfaces/code-name.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/interfaces/flight-filters.interface.d.ts +29 -0
- package/dist/obtservices/base/lib/vendor/interfaces/flight-multi-destination.interface.d.ts +7 -0
- package/dist/obtservices/base/lib/vendor/interfaces/rail-airport-express-stations.interface.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +69 -0
- package/dist/obtservices/base/lib/vendor/interfaces/rail-journey-leg.interface.d.ts +6 -0
- package/dist/obtservices/base/lib/vendor/interfaces/rail-recent-search-args.interface.d.ts +19 -0
- package/dist/obtservices/base/lib/vendor/interfaces/rail-selected-ticket.interface.d.ts +10 -0
- package/dist/obtservices/base/lib/vendor/interfaces/rail-ticket-group.interface.d.ts +26 -0
- package/dist/obtservices/base/lib/vendor/interfaces/rail-ticket-groups.interface.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/interfaces/search-objects.interface.d.ts +16 -0
- package/dist/obtservices/base/lib/vendor/interfaces/select-filter.interface.d.ts +5 -0
- package/dist/obtservices/base/lib/vendor/interfaces/user.data.d.ts +21 -0
- package/dist/obtservices/base/lib/vendor/interfaces/value-display.d.ts +4 -0
- package/dist/obtservices/base/lib/vendor/models/login.model.d.ts +52 -0
- package/dist/obtservices/base/lib/vendor/models/regexp.model.d.ts +10 -0
- package/dist/obtservices/base/lib/vendor/models/traveller.object.d.ts +22 -0
- package/dist/obtservices/base/lib/vendor/services/enterprise-basket.service.d.ts +177 -0
- package/dist/obtservices/base/lib/vendor/services/hotel-avallibility.service.d.ts +31 -0
- package/dist/obtservices/base/lib/vendor/services/http-call.service.d.ts +17 -0
- package/dist/obtservices/base/lib/vendor/services/logon.service.d.ts +39 -0
- package/dist/obtservices/base/lib/vendor/services/modal-opener.service.d.ts +13 -0
- package/dist/obtservices/base/lib/vendor/services/my-bookings.service.d.ts +31 -0
- package/dist/obtservices/base/lib/vendor/services/routehappy.service.d.ts +47 -0
- package/dist/obtservices/base/lib/vendor/services/search.service.d.ts +236 -0
- package/dist/obtservices/base/lib/vendor/services/storage.service.d.ts +9 -0
- package/dist/obtservices/base/lib/vendor/services/url.service.d.ts +10 -0
- package/dist/obtservices/base/lib/vendor/services/user.service.d.ts +62 -0
- package/dist/obtservices/base/lib/vendor/services/webtoken.service.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/testers/base.tester.d.ts +11 -0
- package/dist/obtservices/base/lib/vendor/testers/postcode-validate.tester.d.ts +17 -0
- package/dist/obtservices/base/lib/vendor/testers/validate-mi-free-value.tester.d.ts +17 -0
- package/dist/obtservices/base/lib/vendor/types/graphql.types.d.ts +5597 -0
- package/dist/obtservices/base/lib/vendor/types/types.d.ts +444 -0
- package/dist/obtservices/base/lib/vendor/updaters/accept-new-price.updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/add-item-to-basket.updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/addUserToBasketItem.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/book-basket-updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/create-basket-updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/move-basket-item-to-basket.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/object-updater-enterprise.d.ts +11 -0
- package/dist/obtservices/base/lib/vendor/updaters/remove-basket-updater.d.ts +19 -0
- package/dist/obtservices/base/lib/vendor/updaters/remove-item-from-basket.updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/remove-recent-search-updater.d.ts +19 -0
- package/dist/obtservices/base/lib/vendor/updaters/remove-user-address-updater.d.ts +19 -0
- package/dist/obtservices/base/lib/vendor/updaters/revalidate-basket-updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/save-recent-search-updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/save-user-address.updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/send-basket-for-approval.updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-lead-passenger.updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-mi-group.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-mi-value-updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-paymenr-option.updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/update-basket-notes-updater.d.ts +20 -0
- package/dist/obtservices/base/lib/vendor/updaters/update-basket-title-updater.d.ts +20 -0
- package/dist/obtservices/base/obtservices-base.d.ts +9 -0
- package/dist/obtservices/base/obtservices-base.metadata.json +1 -0
- package/dist/obtservices/base/package.json +11 -0
- package/dist/obtservices/bundles/obtservices-angular.umd.js +32033 -0
- package/dist/obtservices/bundles/obtservices-angular.umd.js.map +1 -0
- package/dist/obtservices/bundles/obtservices-angular.umd.min.js +2 -0
- package/dist/obtservices/bundles/obtservices-angular.umd.min.js.map +1 -0
- package/dist/obtservices/bundles/obtservices-base.umd.js +18609 -0
- package/dist/obtservices/bundles/obtservices-base.umd.js.map +1 -0
- package/dist/obtservices/bundles/obtservices-base.umd.min.js +16 -0
- package/dist/obtservices/bundles/obtservices-base.umd.min.js.map +1 -0
- package/dist/obtservices/bundles/obtservices.umd.js +18 -0
- package/dist/obtservices/bundles/obtservices.umd.js.map +1 -0
- package/dist/obtservices/bundles/obtservices.umd.min.js +2 -0
- package/dist/obtservices/bundles/obtservices.umd.min.js.map +1 -0
- package/dist/obtservices/esm2015/angular/classes.js +4 -0
- package/dist/obtservices/esm2015/angular/components/basket-panel.js +113 -0
- package/dist/obtservices/esm2015/angular/components/with-component.js +26 -0
- package/dist/obtservices/esm2015/angular/components.js +3 -0
- package/dist/obtservices/esm2015/angular/data.js +5 -0
- package/dist/obtservices/esm2015/angular/fetchers.js +33 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/classes/environment.js +10 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/classes/event-messenager.js +16 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/classes/helpers.js +81 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/data/airports.data.json +5508 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/data/flight-booking.data.json +136 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/basket-fetcher.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/cabhire-quote-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/carhire-availability-detail.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/carhire-quote-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/conferma-office-names.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/conferma-quicklist.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/eurostar-quote.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/flight-quote.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-rail-cards.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-rail-station.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-risk-alerts.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-user-company-offices.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-user-recent-searches.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-users-baskets-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/getMiAutoSugestions.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/hotel-avaliability-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/hotel-quote-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/irl-quote-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/lounge-quote.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/parking-quote-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/rail-quote-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-airlines-fetcher.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-airports-fetcher.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-cities.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-depots.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-hotel-chains.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-postcodes.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-rail-stations.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-users-can-book-for-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-addresses.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-fetcher.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-message.fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-products-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-ui-configs-fetcher.js +25 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +91 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/hotel-avallibility.service.js +28 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/http-call.service.js +220 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/logon.service.js +41 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/modal-opener.service.js +15 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/my-bookings.service.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/route-happy.service.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/search.service.js +142 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/storage.service.js +79 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/user.service.js +31 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/services/webtoken.service.js +59 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/testers/postcode-validate.tester.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/testers/validate-mi-free-value.tester.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/types/graphql.angular.types.js +5662 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/accept-new-price.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/add-item-to-basket.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/addUserToBasketItem.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/book-basket-updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/create-basket-updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/move-basket-item-to-basket.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-basket-updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-item-from-basket.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-recent-search.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-user-address.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/revalidate-basket-updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/save-recent-search.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/save-user-address.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/send-basket-for-approval.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-basket-item-lead-passenger.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-basket-item-mi-group.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-basket-item-mi-value-updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-payment-option.updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/update-basket-notes-updater.js +22 -0
- package/dist/obtservices/esm2015/angular/lib/vendor/updaters/update-basket-title-updater.js +22 -0
- package/dist/obtservices/esm2015/angular/obtservices-angular.js +18 -0
- package/dist/obtservices/esm2015/angular/obtservices.module.js +128 -0
- package/dist/obtservices/esm2015/angular/public_api.js +9 -0
- package/dist/obtservices/esm2015/angular/services.js +12 -0
- package/dist/obtservices/esm2015/angular/types.js +2 -0
- package/dist/obtservices/esm2015/angular/updaters.js +14 -0
- package/dist/obtservices/esm2015/base/classes.js +28 -0
- package/dist/obtservices/esm2015/base/fetchers.js +37 -0
- package/dist/obtservices/esm2015/base/interfaces.js +30 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/base-enterprise.js +78 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/base-network-call.js +24 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +35 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/bookable-basket.js +237 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +696 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +1204 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/enviroment.js +12 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +1462 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/eurostar-search-type.enum.js +6 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/event-messenager.js +17 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +1640 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/flight-search-type.enum.js +7 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/helpers.js +978 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +1022 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +1117 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/limited-cache.class.js +64 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +323 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/management-info-and-valid.js +174 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/modal-types.enum.js +22 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +397 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/rail-direction.enum.js +6 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +1324 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/routehappy-request.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/routehappy-response.js +8 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +250 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/user-favourite.enum.js +15 -0
- package/dist/obtservices/esm2015/base/lib/vendor/classes/validator.checker.js +4 -0
- package/dist/obtservices/esm2015/base/lib/vendor/data/countries.json +1212 -0
- package/dist/obtservices/esm2015/base/lib/vendor/data/euro-stations.json +30 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/basket-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/cabhire-quote-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/carhire-availability-detail.fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/carhire-quote-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/conferma-office-names.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/conferma-quicklist.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/eurostar-quote.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-rail-cards.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-rail-station.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-risk-alerts.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-user-company-offices.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-user-recent-searches.fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-users-baskets-fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/getMiAutoSugestions.fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/hotel-avaliability-fetcher.js +22 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/hotel-quote-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/irl-quote-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/list-fetchable-enterprise.js +27 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/lounge-quote.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/object-fetchable-enterprise.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/parking-quote-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/rail-quote-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-airlines.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-airports-fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-cities.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-conferma-cities.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-depots.fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-hotel-chains.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-postcodes.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-rail-stations.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-addresses.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-fetcher.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-message.fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-products-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-ui-configs-fetcher.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +17 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +18 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Isearch.service.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iuser.service.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/car-hire-classes.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/car-hire-filters.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/car-hire-sort.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/cheapest-price.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/code-name.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/flight-filters.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/flight-multi-destination.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-airport-express-stations.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-journey-leg.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-recent-search-args.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-selected-ticket.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-ticket-group.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-ticket-groups.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/search-objects.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/select-filter.interface.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/user.data.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/interfaces/value-display.js +2 -0
- package/dist/obtservices/esm2015/base/lib/vendor/models/login.model.js +71 -0
- package/dist/obtservices/esm2015/base/lib/vendor/models/regexp.model.js +13 -0
- package/dist/obtservices/esm2015/base/lib/vendor/models/traveller.object.js +38 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/enterprise-basket.service.js +669 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +165 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/http-call.service.js +16 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/logon.service.js +177 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/modal-opener.service.js +20 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/my-bookings.service.js +124 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/routehappy.service.js +196 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/search.service.js +1281 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/storage.service.js +3 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/url.service.js +12 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/user.service.js +223 -0
- package/dist/obtservices/esm2015/base/lib/vendor/services/webtoken.service.js +56 -0
- package/dist/obtservices/esm2015/base/lib/vendor/testers/base.tester.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/testers/postcode-validate.tester.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/testers/validate-mi-free-value.tester.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/types/graphql.types.js +456 -0
- package/dist/obtservices/esm2015/base/lib/vendor/types/types.js +161 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/accept-new-price.updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/add-item-to-basket.updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/addUserToBasketItem.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/book-basket-updater.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/create-basket-updater.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/move-basket-item-to-basket.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/object-updater-enterprise.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-basket-updater.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-item-from-basket.updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-recent-search-updater.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-user-address-updater.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/revalidate-basket-updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/save-recent-search-updater.js +11 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/save-user-address.updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/send-basket-for-approval.updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-lead-passenger.updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-mi-group.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-mi-value-updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-paymenr-option.updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/update-basket-notes-updater.js +10 -0
- package/dist/obtservices/esm2015/base/lib/vendor/updaters/update-basket-title-updater.js +10 -0
- package/dist/obtservices/esm2015/base/models.js +4 -0
- package/dist/obtservices/esm2015/base/obtservices-base.js +9 -0
- package/dist/obtservices/esm2015/base/public_api.js +9 -0
- package/dist/obtservices/esm2015/base/services.js +13 -0
- package/dist/obtservices/esm2015/base/testers.js +3 -0
- package/dist/obtservices/esm2015/base/types.js +2 -0
- package/dist/obtservices/esm2015/base/updaters.js +21 -0
- package/dist/obtservices/esm2015/obtservices.js +5 -0
- package/dist/obtservices/esm2015/public_api.js +2 -0
- package/dist/obtservices/fesm2015/obtservices-angular.js +35267 -0
- package/dist/obtservices/fesm2015/obtservices-angular.js.map +1 -0
- package/dist/obtservices/fesm2015/obtservices-base.js +16573 -0
- package/dist/obtservices/fesm2015/obtservices-base.js.map +1 -0
- package/dist/obtservices/fesm2015/obtservices.js +8 -0
- package/dist/obtservices/fesm2015/obtservices.js.map +1 -0
- package/dist/obtservices/obtservices.d.ts +4 -0
- package/dist/obtservices/obtservices.metadata.json +1 -0
- package/dist/obtservices/package.json +23 -0
- package/dist/obtservices/public_api.d.ts +1 -0
- package/dist/obtservices/tsconfig.lib.tsbuildinfo +3 -0
- package/package.json +1 -1
- package/projects/obtservices/angular/package.json +0 -3
- package/projects/obtservices/angular/src/components/basket-panel.ts +0 -139
- package/projects/obtservices/angular/src/components/with-component.ts +0 -40
- package/projects/obtservices/angular/src/data.ts +0 -5
- package/projects/obtservices/angular/src/fetchers.ts +0 -32
- package/projects/obtservices/angular/src/lib/vendor/classes/environment.ts +0 -5
- package/projects/obtservices/angular/src/lib/vendor/classes/event-messenager.ts +0 -11
- package/projects/obtservices/angular/src/lib/vendor/classes/helpers.ts +0 -87
- package/projects/obtservices/angular/src/lib/vendor/data/airports.data.json +0 -5508
- package/projects/obtservices/angular/src/lib/vendor/data/animations.ts +0 -38
- package/projects/obtservices/angular/src/lib/vendor/data/booking-expected-responses.json +0 -100
- package/projects/obtservices/angular/src/lib/vendor/data/cities.data.json +0 -31499
- package/projects/obtservices/angular/src/lib/vendor/data/countries.json +0 -1212
- package/projects/obtservices/angular/src/lib/vendor/data/flight-booking.data.json +0 -136
- package/projects/obtservices/angular/src/lib/vendor/data/postcodes1.json +0 -194
- package/projects/obtservices/angular/src/lib/vendor/data/rail_addresses.json +0 -2524
- package/projects/obtservices/angular/src/lib/vendor/fetchers/basket-fetcher.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/fetchers/cabhire-quote-fetcher.ts +0 -15
- package/projects/obtservices/angular/src/lib/vendor/fetchers/carhire-availability-detail.fetcher.ts +0 -17
- package/projects/obtservices/angular/src/lib/vendor/fetchers/carhire-quote-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/conferma-office-names.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/conferma-quicklist.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/eurostar-quote.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/flight-quote.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/get-rail-cards.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/get-rail-station.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/get-risk-alerts.fetcher.ts +0 -18
- package/projects/obtservices/angular/src/lib/vendor/fetchers/get-user-company-offices.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/get-user-recent-searches.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/get-users-baskets-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/getMiAutoSugestions.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/hotel-avaliability-fetcher.ts +0 -17
- package/projects/obtservices/angular/src/lib/vendor/fetchers/hotel-quote-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/irl-quote-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/lounge-quote.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/parking-quote-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/rail-quote-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-airlines-fetcher.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-airports-fetcher.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-cities.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-conferma-cities.fetcher.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-depots.fetcher.ts +0 -18
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-hotel-chains.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-postcodes.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-rail-stations.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/search-users-can-book-for-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/user-addresses.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/user-fetcher.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/fetchers/user-message.fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/user-products-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/fetchers/user-ui-configs-fetcher.ts +0 -16
- package/projects/obtservices/angular/src/lib/vendor/services/enterprise-basket.service.ts +0 -133
- package/projects/obtservices/angular/src/lib/vendor/services/hotel-avallibility.service.ts +0 -19
- package/projects/obtservices/angular/src/lib/vendor/services/http-call.service.ts +0 -252
- package/projects/obtservices/angular/src/lib/vendor/services/logon.service.ts +0 -40
- package/projects/obtservices/angular/src/lib/vendor/services/modal-opener.service.ts +0 -9
- package/projects/obtservices/angular/src/lib/vendor/services/my-bookings.service.ts +0 -21
- package/projects/obtservices/angular/src/lib/vendor/services/route-happy.service.ts +0 -11
- package/projects/obtservices/angular/src/lib/vendor/services/search.service.ts +0 -213
- package/projects/obtservices/angular/src/lib/vendor/services/storage.service.ts +0 -82
- package/projects/obtservices/angular/src/lib/vendor/services/user.service.ts +0 -36
- package/projects/obtservices/angular/src/lib/vendor/services/webtoken.service.ts +0 -62
- package/projects/obtservices/angular/src/lib/vendor/testers/postcode-validate.tester.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/testers/validate-mi-free-value.tester.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/types/graphql.angular.types.ts +0 -11081
- package/projects/obtservices/angular/src/lib/vendor/updaters/accept-new-price.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/add-item-to-basket.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/addUserToBasketItem.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/book-basket-updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/create-basket-updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/move-basket-item-to-basket.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/remove-basket-updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/remove-item-from-basket.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/remove-recent-search.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/remove-user-address.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/revalidate-basket-updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/save-recent-search.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/save-user-address.updater.ts +0 -11
- package/projects/obtservices/angular/src/lib/vendor/updaters/send-basket-for-approval.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/set-basket-item-lead-passenger.updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/set-basket-item-mi-group.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/set-basket-item-mi-value-updater.ts +0 -15
- package/projects/obtservices/angular/src/lib/vendor/updaters/set-payment-option.updater.ts +0 -15
- package/projects/obtservices/angular/src/lib/vendor/updaters/update-basket-notes-updater.ts +0 -14
- package/projects/obtservices/angular/src/lib/vendor/updaters/update-basket-title-updater.ts +0 -14
- package/projects/obtservices/angular/src/obtservices.module.ts +0 -131
- package/projects/obtservices/base/package.json +0 -3
- package/projects/obtservices/base/src/custom.d.ts +0 -3
- package/projects/obtservices/base/src/fetchers.ts +0 -36
- package/projects/obtservices/base/src/lib/vendor/classes/base-enterprise.ts +0 -126
- package/projects/obtservices/base/src/lib/vendor/classes/base-network-call.ts +0 -40
- package/projects/obtservices/base/src/lib/vendor/classes/basket-info-mi-details.impl.ts +0 -68
- package/projects/obtservices/base/src/lib/vendor/classes/bookable-basket.ts +0 -343
- package/projects/obtservices/base/src/lib/vendor/classes/cabhire-enterprise-search.ts +0 -907
- package/projects/obtservices/base/src/lib/vendor/classes/carhire-enterprise-search.ts +0 -1597
- package/projects/obtservices/base/src/lib/vendor/classes/empty-enterprise-search.ts +0 -75
- package/projects/obtservices/base/src/lib/vendor/classes/enviroment.ts +0 -25
- package/projects/obtservices/base/src/lib/vendor/classes/eurostar-enterprise-search.ts +0 -2126
- package/projects/obtservices/base/src/lib/vendor/classes/eurostar-search-type.enum.ts +0 -4
- package/projects/obtservices/base/src/lib/vendor/classes/event-messenager.ts +0 -23
- package/projects/obtservices/base/src/lib/vendor/classes/flight-enterprise-search.ts +0 -2399
- package/projects/obtservices/base/src/lib/vendor/classes/flight-search-type.enum.ts +0 -5
- package/projects/obtservices/base/src/lib/vendor/classes/helpers.ts +0 -1233
- package/projects/obtservices/base/src/lib/vendor/classes/hotel-enterprise-search.ts +0 -1370
- package/projects/obtservices/base/src/lib/vendor/classes/irl-enterprise-search.ts +0 -1380
- package/projects/obtservices/base/src/lib/vendor/classes/limited-cache.class.ts +0 -70
- package/projects/obtservices/base/src/lib/vendor/classes/lounges-enterprise-search.ts +0 -444
- package/projects/obtservices/base/src/lib/vendor/classes/management-info-and-valid.ts +0 -268
- package/projects/obtservices/base/src/lib/vendor/classes/modal-types.enum.ts +0 -28
- package/projects/obtservices/base/src/lib/vendor/classes/parking-enterprise-search.ts +0 -541
- package/projects/obtservices/base/src/lib/vendor/classes/rail-direction.enum.ts +0 -4
- package/projects/obtservices/base/src/lib/vendor/classes/rail-enterprise-search.ts +0 -1751
- package/projects/obtservices/base/src/lib/vendor/classes/routehappy-request.ts +0 -146
- package/projects/obtservices/base/src/lib/vendor/classes/routehappy-response.ts +0 -128
- package/projects/obtservices/base/src/lib/vendor/classes/supplementary-booking-info-impl.ts +0 -375
- package/projects/obtservices/base/src/lib/vendor/classes/user-favourite.enum.ts +0 -12
- package/projects/obtservices/base/src/lib/vendor/classes/validator.checker.ts +0 -7
- package/projects/obtservices/base/src/lib/vendor/data/airports.data.json +0 -5508
- package/projects/obtservices/base/src/lib/vendor/data/booking-expected-responses.json +0 -100
- package/projects/obtservices/base/src/lib/vendor/data/cities.data.json +0 -31499
- package/projects/obtservices/base/src/lib/vendor/data/countries.json +0 -1212
- package/projects/obtservices/base/src/lib/vendor/data/euro-stations.json +0 -30
- package/projects/obtservices/base/src/lib/vendor/data/flight-booking.data.json +0 -136
- package/projects/obtservices/base/src/lib/vendor/data/postcodes1.json +0 -194
- package/projects/obtservices/base/src/lib/vendor/data/rail_addresses.json +0 -2524
- package/projects/obtservices/base/src/lib/vendor/fetchers/basket-fetcher.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/fetchers/cabhire-quote-fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/carhire-availability-detail.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/carhire-quote-fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/conferma-office-names.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/conferma-quicklist.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/eurostar-quote.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/flight-quote.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/get-rail-cards.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/get-rail-station.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/get-risk-alerts.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/get-user-company-offices.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/get-user-recent-searches.fetcher.ts +0 -36
- package/projects/obtservices/base/src/lib/vendor/fetchers/get-users-baskets-fetcher.ts +0 -33
- package/projects/obtservices/base/src/lib/vendor/fetchers/getMiAutoSugestions.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/hotel-avaliability-fetcher.ts +0 -53
- package/projects/obtservices/base/src/lib/vendor/fetchers/hotel-quote-fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/irl-quote-fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/list-fetchable-enterprise.ts +0 -59
- package/projects/obtservices/base/src/lib/vendor/fetchers/lounge-quote.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/object-fetchable-enterprise.ts +0 -20
- package/projects/obtservices/base/src/lib/vendor/fetchers/parking-quote-fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/rail-quote-fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-airlines.fetcher.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-airports-fetcher.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-cities.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-conferma-cities.fetcher.ts +0 -32
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-depots.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-hotel-chains.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-postcodes.fetcher.ts +0 -37
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-rail-stations.fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/search-users-can-book-for-fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/user-addresses.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/user-fetcher.ts +0 -27
- package/projects/obtservices/base/src/lib/vendor/fetchers/user-message.fetcher.ts +0 -34
- package/projects/obtservices/base/src/lib/vendor/fetchers/user-products-fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/fetchers/user-ui-configs-fetcher.ts +0 -35
- package/projects/obtservices/base/src/lib/vendor/interfaces/Icabhire-enterprise-search.ts +0 -174
- package/projects/obtservices/base/src/lib/vendor/interfaces/Icarhire-enterprise-search.ts +0 -143
- package/projects/obtservices/base/src/lib/vendor/interfaces/Ienterprise-basket.service.ts +0 -127
- package/projects/obtservices/base/src/lib/vendor/interfaces/Ieurostar-enterprise-search.ts +0 -197
- package/projects/obtservices/base/src/lib/vendor/interfaces/Iflight-enterprise-search.ts +0 -196
- package/projects/obtservices/base/src/lib/vendor/interfaces/Ihotel-enterprise-search.ts +0 -219
- package/projects/obtservices/base/src/lib/vendor/interfaces/Iirl-enterprise-search.ts +0 -135
- package/projects/obtservices/base/src/lib/vendor/interfaces/Ilounges-enterprise-search.ts +0 -58
- package/projects/obtservices/base/src/lib/vendor/interfaces/Imybookings.service.ts +0 -27
- package/projects/obtservices/base/src/lib/vendor/interfaces/Iparking-enterprise-search.ts +0 -72
- package/projects/obtservices/base/src/lib/vendor/interfaces/Irail-enterprise-search.ts +0 -161
- package/projects/obtservices/base/src/lib/vendor/interfaces/Isearch.service.ts +0 -178
- package/projects/obtservices/base/src/lib/vendor/interfaces/Isupplementary-booking-info-impl.ts +0 -63
- package/projects/obtservices/base/src/lib/vendor/interfaces/Iuser.service.ts +0 -87
- package/projects/obtservices/base/src/lib/vendor/interfaces/car-hire-classes.interface.ts +0 -8
- package/projects/obtservices/base/src/lib/vendor/interfaces/car-hire-filters.interface.ts +0 -11
- package/projects/obtservices/base/src/lib/vendor/interfaces/car-hire-sort.interface.ts +0 -4
- package/projects/obtservices/base/src/lib/vendor/interfaces/cheapest-price.ts +0 -4
- package/projects/obtservices/base/src/lib/vendor/interfaces/code-name.ts +0 -4
- package/projects/obtservices/base/src/lib/vendor/interfaces/flight-filters.interface.ts +0 -41
- package/projects/obtservices/base/src/lib/vendor/interfaces/flight-multi-destination.interface.ts +0 -8
- package/projects/obtservices/base/src/lib/vendor/interfaces/rail-airport-express-stations.interface.ts +0 -4
- package/projects/obtservices/base/src/lib/vendor/interfaces/rail-basket-item.interface.ts +0 -79
- package/projects/obtservices/base/src/lib/vendor/interfaces/rail-journey-leg.interface.ts +0 -6
- package/projects/obtservices/base/src/lib/vendor/interfaces/rail-recent-search-args.interface.ts +0 -20
- package/projects/obtservices/base/src/lib/vendor/interfaces/rail-selected-ticket.interface.ts +0 -11
- package/projects/obtservices/base/src/lib/vendor/interfaces/rail-ticket-group.interface.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/interfaces/rail-ticket-groups.interface.ts +0 -5
- package/projects/obtservices/base/src/lib/vendor/interfaces/search-objects.interface.ts +0 -17
- package/projects/obtservices/base/src/lib/vendor/interfaces/select-filter.interface.ts +0 -5
- package/projects/obtservices/base/src/lib/vendor/interfaces/user.data.ts +0 -22
- package/projects/obtservices/base/src/lib/vendor/interfaces/value-display.ts +0 -4
- package/projects/obtservices/base/src/lib/vendor/models/login.model.ts +0 -97
- package/projects/obtservices/base/src/lib/vendor/models/regexp.model.ts +0 -13
- package/projects/obtservices/base/src/lib/vendor/models/traveller.object.ts +0 -61
- package/projects/obtservices/base/src/lib/vendor/services/enterprise-basket.service.ts +0 -1150
- package/projects/obtservices/base/src/lib/vendor/services/hotel-avallibility.service.ts +0 -251
- package/projects/obtservices/base/src/lib/vendor/services/http-call.service.ts +0 -57
- package/projects/obtservices/base/src/lib/vendor/services/logon.service.ts +0 -245
- package/projects/obtservices/base/src/lib/vendor/services/modal-opener.service.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/services/my-bookings.service.ts +0 -184
- package/projects/obtservices/base/src/lib/vendor/services/routehappy.service.ts +0 -275
- package/projects/obtservices/base/src/lib/vendor/services/search.service.ts +0 -2026
- package/projects/obtservices/base/src/lib/vendor/services/storage.service.ts +0 -15
- package/projects/obtservices/base/src/lib/vendor/services/url.service.ts +0 -12
- package/projects/obtservices/base/src/lib/vendor/services/user.service.ts +0 -354
- package/projects/obtservices/base/src/lib/vendor/services/webtoken.service.ts +0 -66
- package/projects/obtservices/base/src/lib/vendor/testers/base.tester.ts +0 -18
- package/projects/obtservices/base/src/lib/vendor/testers/postcode-validate.tester.ts +0 -24
- package/projects/obtservices/base/src/lib/vendor/testers/validate-mi-free-value.tester.ts +0 -23
- package/projects/obtservices/base/src/lib/vendor/types/graphql.types.ts +0 -6184
- package/projects/obtservices/base/src/lib/vendor/types/types.ts +0 -630
- package/projects/obtservices/base/src/lib/vendor/updaters/accept-new-price.updater.ts +0 -31
- package/projects/obtservices/base/src/lib/vendor/updaters/add-item-to-basket.updater.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/updaters/addUserToBasketItem.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/updaters/book-basket-updater.ts +0 -28
- package/projects/obtservices/base/src/lib/vendor/updaters/create-basket-updater.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/updaters/move-basket-item-to-basket.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/updaters/object-updater-enterprise.ts +0 -20
- package/projects/obtservices/base/src/lib/vendor/updaters/remove-basket-updater.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/updaters/remove-item-from-basket.updater.ts +0 -28
- package/projects/obtservices/base/src/lib/vendor/updaters/remove-recent-search-updater.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/updaters/remove-user-address-updater.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/updaters/revalidate-basket-updater.ts +0 -29
- package/projects/obtservices/base/src/lib/vendor/updaters/save-recent-search-updater.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/updaters/save-user-address.updater.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/updaters/send-basket-for-approval.updater.ts +0 -31
- package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-lead-passenger.updater.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-mi-group.ts +0 -32
- package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-mi-value-updater.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-paymenr-option.updater.ts +0 -28
- package/projects/obtservices/base/src/lib/vendor/updaters/update-basket-notes-updater.ts +0 -30
- package/projects/obtservices/base/src/lib/vendor/updaters/update-basket-title-updater.ts +0 -30
- package/projects/obtservices/base/src/testers.ts +0 -2
- package/projects/obtservices/graphQL/autogenerated/index.js +0 -2
- package/projects/obtservices/graphQL/autogenerated/mutations/acceptNewPrice.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/addItemToBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/addUsersToBasketItem.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/bookBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/cancelBooking.gql +0 -6
- package/projects/obtservices/graphQL/autogenerated/mutations/confermaCreateCard.gql +0 -23
- package/projects/obtservices/graphQL/autogenerated/mutations/confermaDeleteCard.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/mutations/createBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/deleteBasket.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/mutations/deleteFavouriteSearch.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/mutations/deleteRecentSearch.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/mutations/deleteUserAddress.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/mutations/index.js +0 -36
- package/projects/obtservices/graphQL/autogenerated/mutations/moveItemToADifferentBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/removeItemFromBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/removeItemsFromBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/removeUserFromBasketItem.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/reopenBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/revalidateBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/revalidateBasketItem.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/saveFavouriteSearch.gql +0 -348
- package/projects/obtservices/graphQL/autogenerated/mutations/saveRecentSearch.gql +0 -348
- package/projects/obtservices/graphQL/autogenerated/mutations/saveUserAddress.gql +0 -14
- package/projects/obtservices/graphQL/autogenerated/mutations/sendBasketForApproval.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/setAddressAsUserPrimary.gql +0 -14
- package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemLeadPassenger.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemMIGroup.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemMIValue.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemPaymentMethod.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/setMIDefaultValue.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/mutations/setUserLanguage.gql +0 -339
- package/projects/obtservices/graphQL/autogenerated/mutations/updateBasketNotes.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/mutations/updateBasketTitle.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/queries/alive.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/queries/carHireAvailabilityDetailRequest.gql +0 -42
- package/projects/obtservices/graphQL/autogenerated/queries/confermaBlockClientHotels.gql +0 -23
- package/projects/obtservices/graphQL/autogenerated/queries/confermaBlockConsumerHotels.gql +0 -23
- package/projects/obtservices/graphQL/autogenerated/queries/confermaListCards.gql +0 -11
- package/projects/obtservices/graphQL/autogenerated/queries/confermaUnblockClientHotels.gql +0 -23
- package/projects/obtservices/graphQL/autogenerated/queries/confermaUnblockConsumerHotels.gql +0 -23
- package/projects/obtservices/graphQL/autogenerated/queries/getCOVIDMicrositeToken.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/queries/getCancellationInfo.gql +0 -7
- package/projects/obtservices/graphQL/autogenerated/queries/getCarHireDepots.gql +0 -13
- package/projects/obtservices/graphQL/autogenerated/queries/getConfermaOffice.gql +0 -50
- package/projects/obtservices/graphQL/autogenerated/queries/getConfermaOfficeNames.gql +0 -26
- package/projects/obtservices/graphQL/autogenerated/queries/getConfermaQuicklist.gql +0 -131
- package/projects/obtservices/graphQL/autogenerated/queries/getCountries.gql +0 -8
- package/projects/obtservices/graphQL/autogenerated/queries/getHotelAvailability.gql +0 -78
- package/projects/obtservices/graphQL/autogenerated/queries/getHotelChains.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/queries/getIRLSupplierStation.gql +0 -28
- package/projects/obtservices/graphQL/autogenerated/queries/getMultipleHotelsAvailability.gql +0 -78
- package/projects/obtservices/graphQL/autogenerated/queries/getPostcodeDetails.gql +0 -25
- package/projects/obtservices/graphQL/autogenerated/queries/getRailStation.gql +0 -27
- package/projects/obtservices/graphQL/autogenerated/queries/getRailcards.gql +0 -6
- package/projects/obtservices/graphQL/autogenerated/queries/getRiskAlerts.gql +0 -17
- package/projects/obtservices/graphQL/autogenerated/queries/getUser.gql +0 -339
- package/projects/obtservices/graphQL/autogenerated/queries/getUserAddresses.gql +0 -14
- package/projects/obtservices/graphQL/autogenerated/queries/getUserBasket.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/queries/getUserBaskets.gql +0 -1580
- package/projects/obtservices/graphQL/autogenerated/queries/getUserCompanyOffices.gql +0 -88
- package/projects/obtservices/graphQL/autogenerated/queries/getUserCurrentCarbonAllowance.gql +0 -524
- package/projects/obtservices/graphQL/autogenerated/queries/getUserFavouriteSearches.gql +0 -348
- package/projects/obtservices/graphQL/autogenerated/queries/getUserMIAutoSuggestValues.gql +0 -10
- package/projects/obtservices/graphQL/autogenerated/queries/getUserMessages.gql +0 -10
- package/projects/obtservices/graphQL/autogenerated/queries/getUserPhoneNumbers.gql +0 -13
- package/projects/obtservices/graphQL/autogenerated/queries/getUserRecentSearches.gql +0 -348
- package/projects/obtservices/graphQL/autogenerated/queries/getUserServices.gql +0 -16
- package/projects/obtservices/graphQL/autogenerated/queries/getUserTravelRules.gql +0 -111
- package/projects/obtservices/graphQL/autogenerated/queries/getUserUIConfigs.gql +0 -52
- package/projects/obtservices/graphQL/autogenerated/queries/index.js +0 -64
- package/projects/obtservices/graphQL/autogenerated/queries/isPostcodeValid.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/queries/postcodeAutoSuggest.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/queries/searchAirlines.gql +0 -32
- package/projects/obtservices/graphQL/autogenerated/queries/searchAirports.gql +0 -60
- package/projects/obtservices/graphQL/autogenerated/queries/searchCabHire.gql +0 -63
- package/projects/obtservices/graphQL/autogenerated/queries/searchCarHire.gql +0 -104
- package/projects/obtservices/graphQL/autogenerated/queries/searchCities.gql +0 -14
- package/projects/obtservices/graphQL/autogenerated/queries/searchConfermaCities.gql +0 -11
- package/projects/obtservices/graphQL/autogenerated/queries/searchEurostar.gql +0 -833
- package/projects/obtservices/graphQL/autogenerated/queries/searchFastTrack.gql +0 -46
- package/projects/obtservices/graphQL/autogenerated/queries/searchFlights.gql +0 -23
- package/projects/obtservices/graphQL/autogenerated/queries/searchFlightsV2.gql +0 -833
- package/projects/obtservices/graphQL/autogenerated/queries/searchHotelChains.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/queries/searchHotels.gql +0 -131
- package/projects/obtservices/graphQL/autogenerated/queries/searchIRL.gql +0 -514
- package/projects/obtservices/graphQL/autogenerated/queries/searchIRLSupplierStations.gql +0 -28
- package/projects/obtservices/graphQL/autogenerated/queries/searchLounges.gql +0 -89
- package/projects/obtservices/graphQL/autogenerated/queries/searchParking.gql +0 -70
- package/projects/obtservices/graphQL/autogenerated/queries/searchPostcodes.gql +0 -25
- package/projects/obtservices/graphQL/autogenerated/queries/searchRail.gql +0 -840
- package/projects/obtservices/graphQL/autogenerated/queries/searchRailStations.gql +0 -27
- package/projects/obtservices/graphQL/autogenerated/queries/searchUserCanBookFor.gql +0 -339
- package/projects/obtservices/graphQL/autogenerated/queries/validateBasketItemMI.gql +0 -3
- package/projects/obtservices/graphQL/autogenerated/queries/validateUserMIFreeValue.gql +0 -3
- package/projects/obtservices/graphQL/documents/acceptNewPrice.graphql +0 -5
- package/projects/obtservices/graphQL/documents/addUserToBasketItem.graphql +0 -9
- package/projects/obtservices/graphQL/documents/basket.fragments.graphql +0 -171
- package/projects/obtservices/graphQL/documents/baskets.graphql +0 -111
- package/projects/obtservices/graphQL/documents/bookBasket.graphql +0 -9
- package/projects/obtservices/graphQL/documents/cabhire.graphql +0 -66
- package/projects/obtservices/graphQL/documents/carHireAvailabilityDetailRequest.graphql +0 -44
- package/projects/obtservices/graphQL/documents/carhire.graphql +0 -117
- package/projects/obtservices/graphQL/documents/deleteRecentSearch.graphql +0 -3
- package/projects/obtservices/graphQL/documents/deleteUserAddress.graphql +0 -3
- package/projects/obtservices/graphQL/documents/error.fragments.graphql +0 -10
- package/projects/obtservices/graphQL/documents/flights.graphql +0 -830
- package/projects/obtservices/graphQL/documents/getCarHireDepots.graphql +0 -13
- package/projects/obtservices/graphQL/documents/getConfermaOfficeNames.graphql +0 -11
- package/projects/obtservices/graphQL/documents/getConfermaQuicklist.graphql +0 -108
- package/projects/obtservices/graphQL/documents/getRailStation.graphql +0 -31
- package/projects/obtservices/graphQL/documents/getRailcards.graphql +0 -6
- package/projects/obtservices/graphQL/documents/getRiskAlerts.graphql +0 -24
- package/projects/obtservices/graphQL/documents/getUserAddresses.graphql +0 -14
- package/projects/obtservices/graphQL/documents/getUserCompanyOffices.graphql +0 -18
- package/projects/obtservices/graphQL/documents/getUserCurrentCarbonAllowance.graphql +0 -29
- package/projects/obtservices/graphQL/documents/getUserMIAutoSuggestValues.graphql +0 -10
- package/projects/obtservices/graphQL/documents/getUserPhoneNumbers.graphql +0 -13
- package/projects/obtservices/graphQL/documents/getUserRecentSearches.graphql +0 -20
- package/projects/obtservices/graphQL/documents/hotels.graphql +0 -242
- package/projects/obtservices/graphQL/documents/isPostcodeValid.graphql +0 -3
- package/projects/obtservices/graphQL/documents/lookups.graphql +0 -54
- package/projects/obtservices/graphQL/documents/lounges.graphql +0 -88
- package/projects/obtservices/graphQL/documents/moveItemToADifferentBasket.graphql +0 -9
- package/projects/obtservices/graphQL/documents/parking.graphql +0 -79
- package/projects/obtservices/graphQL/documents/rail.graphql +0 -645
- package/projects/obtservices/graphQL/documents/saveRecentSearch.graphql +0 -5
- package/projects/obtservices/graphQL/documents/saveUserAddress.graphql +0 -14
- package/projects/obtservices/graphQL/documents/searchAirlines.graphql +0 -32
- package/projects/obtservices/graphQL/documents/searchCities.graphql +0 -14
- package/projects/obtservices/graphQL/documents/searchConfermaCities.graphql +0 -11
- package/projects/obtservices/graphQL/documents/searchEurostar.graphql +0 -810
- package/projects/obtservices/graphQL/documents/searchHotelChains.graphql +0 -3
- package/projects/obtservices/graphQL/documents/searchIRL.graphql +0 -521
- package/projects/obtservices/graphQL/documents/searchPostcodes.graphql +0 -7
- package/projects/obtservices/graphQL/documents/searchRailStations.graphql +0 -27
- package/projects/obtservices/graphQL/documents/searchUserAddresses.graphql +0 -14
- package/projects/obtservices/graphQL/documents/set-basker-item-mi-group.graphql +0 -9
- package/projects/obtservices/graphQL/documents/setBasketItemLeadPassenger.graphql +0 -5
- package/projects/obtservices/graphQL/documents/setBasketItemMIValue.graphql +0 -16
- package/projects/obtservices/graphQL/documents/setBasketItemPaymentMethod.graphql +0 -12
- package/projects/obtservices/graphQL/documents/updateBasketNotes.graphql +0 -10
- package/projects/obtservices/graphQL/documents/updateBasketTitle.graphql +0 -10
- package/projects/obtservices/graphQL/documents/user.fragments.graphql +0 -65
- package/projects/obtservices/graphQL/documents/user.graphql +0 -95
- package/projects/obtservices/graphQL/documents/validateUserMIFreeValue.graphql +0 -3
- package/projects/obtservices/graphQL/schema/schema.graphql +0 -2635
- package/projects/obtservices/karma.conf.js +0 -32
- package/projects/obtservices/ng-package.json +0 -7
- package/projects/obtservices/package-lock.json +0 -5
- package/projects/obtservices/package.json +0 -12
- package/projects/obtservices/src/obtservices.ts +0 -0
- package/projects/obtservices/src/public_api.ts +0 -1
- package/projects/obtservices/tsconfig.lib.json +0 -30
- package/projects/obtservices/tsconfig.spec.json +0 -17
- package/projects/obtservices/tslint.json +0 -17
- /package/{projects → dist}/obtservices/README.md +0 -0
- /package/{projects/obtservices/angular/src/classes.ts → dist/obtservices/angular/classes.d.ts} +0 -0
- /package/{projects/obtservices/angular/src/components.ts → dist/obtservices/angular/components.d.ts} +0 -0
- /package/{projects/obtservices/angular/src/public_api.ts → dist/obtservices/angular/public_api.d.ts} +0 -0
- /package/{projects/obtservices/angular/src/services.ts → dist/obtservices/angular/services.d.ts} +0 -0
- /package/{projects/obtservices/angular/src/types.ts → dist/obtservices/angular/types.d.ts} +0 -0
- /package/{projects/obtservices/angular/src/updaters.ts → dist/obtservices/angular/updaters.d.ts} +0 -0
- /package/{projects/obtservices/base/src/classes.ts → dist/obtservices/base/classes.d.ts} +0 -0
- /package/{projects/obtservices/base/src/interfaces.ts → dist/obtservices/base/interfaces.d.ts} +0 -0
- /package/{projects/obtservices/base/src/models.ts → dist/obtservices/base/models.d.ts} +0 -0
- /package/{projects/obtservices/base/src/public_api.ts → dist/obtservices/base/public_api.d.ts} +0 -0
- /package/{projects/obtservices/base/src/services.ts → dist/obtservices/base/services.d.ts} +0 -0
- /package/{projects/obtservices/angular/src/testers.ts → dist/obtservices/base/testers.d.ts} +0 -0
- /package/{projects/obtservices/base/src/types.ts → dist/obtservices/base/types.d.ts} +0 -0
- /package/{projects/obtservices/base/src/updaters.ts → dist/obtservices/base/updaters.d.ts} +0 -0
|
@@ -0,0 +1,978 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
import _ from 'lodash';
|
|
4
|
+
import { FlightDirectionEnum } from '../types/types';
|
|
5
|
+
import { PassengerType, ServiceType } from '../types/graphql.types';
|
|
6
|
+
import { Memorise } from './limited-cache.class';
|
|
7
|
+
const FLIGHT_MAX_CHILD_AGE_YEARS = 16;
|
|
8
|
+
const RAIL_MAX_CHILD_AGE_YEARS = 12;
|
|
9
|
+
const EUROSTAR_MAX_CHILD_AGE_YEARS = 12;
|
|
10
|
+
const COACH_MAX_CHILD_AGE_YEARS = 15;
|
|
11
|
+
const LOUNGES_MAX_CHILD_AGE_YEARS = 12;
|
|
12
|
+
const FLIGHT_MAX_INFANT_AGE_YEARS = 0;
|
|
13
|
+
const RAIL_MAX_INFANT_AGE_YEARS = 0;
|
|
14
|
+
const COACH_MAX_INFANT_AGE_YEARS = 0;
|
|
15
|
+
const LOUNGES_MAX_INFANT_AGE_YEARS = 0;
|
|
16
|
+
const months = [
|
|
17
|
+
'Jan',
|
|
18
|
+
'Feb',
|
|
19
|
+
'Mar',
|
|
20
|
+
'Apr',
|
|
21
|
+
'May',
|
|
22
|
+
'Jun',
|
|
23
|
+
'Jul',
|
|
24
|
+
'Aug',
|
|
25
|
+
'Sep',
|
|
26
|
+
'Oct',
|
|
27
|
+
'Nov',
|
|
28
|
+
'Dec'
|
|
29
|
+
];
|
|
30
|
+
const full_months = [
|
|
31
|
+
'January',
|
|
32
|
+
'February',
|
|
33
|
+
'March',
|
|
34
|
+
'April',
|
|
35
|
+
'May',
|
|
36
|
+
'June',
|
|
37
|
+
'July',
|
|
38
|
+
'August',
|
|
39
|
+
'September',
|
|
40
|
+
'October',
|
|
41
|
+
'November',
|
|
42
|
+
'December'
|
|
43
|
+
];
|
|
44
|
+
const weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
|
45
|
+
const full_weekdays = [
|
|
46
|
+
'Sunday',
|
|
47
|
+
'Monday',
|
|
48
|
+
'Tuesday',
|
|
49
|
+
'Wednesday',
|
|
50
|
+
'Thursday',
|
|
51
|
+
'Friday',
|
|
52
|
+
'Saturday'
|
|
53
|
+
];
|
|
54
|
+
export class BaseHelperRoutines {
|
|
55
|
+
minToHour(dur) {
|
|
56
|
+
return `${Math.floor(dur / 60)}h ${dur % 60}m`;
|
|
57
|
+
}
|
|
58
|
+
makeColonTime(time) {
|
|
59
|
+
return time.substring(0, 2) + ':' + time.substring(2, 4);
|
|
60
|
+
}
|
|
61
|
+
nonNullMin(key, ...args) {
|
|
62
|
+
return args.reduce((current, item) => {
|
|
63
|
+
if (item && item[key]) {
|
|
64
|
+
if (current.min > Number(item[key])) {
|
|
65
|
+
return { item, min: Number(item[key]) };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return current;
|
|
69
|
+
}, { min: Number.MAX_SAFE_INTEGER, item: null }).item;
|
|
70
|
+
}
|
|
71
|
+
joinByComma(...attributes) {
|
|
72
|
+
return attributes
|
|
73
|
+
.reduce((acc, attr) => {
|
|
74
|
+
if (_.isEmpty(attr)) {
|
|
75
|
+
acc += attr + ',';
|
|
76
|
+
}
|
|
77
|
+
return acc;
|
|
78
|
+
}, '')
|
|
79
|
+
.slice(0, -1);
|
|
80
|
+
}
|
|
81
|
+
mutuallyInclude(a, b) {
|
|
82
|
+
try {
|
|
83
|
+
return a.includes(b) || b.includes(a);
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
console.warn('Trying to mutually compare undefined variable.');
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
findByKey(array, key, value) {
|
|
91
|
+
return array
|
|
92
|
+
.filter((item) => {
|
|
93
|
+
return item[key] === value;
|
|
94
|
+
})
|
|
95
|
+
.pop();
|
|
96
|
+
}
|
|
97
|
+
dateToNgDate(date) {
|
|
98
|
+
return {
|
|
99
|
+
year: date.getFullYear(),
|
|
100
|
+
month: date.getMonth() + 1,
|
|
101
|
+
day: date.getDate()
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
convertToYYMMDD(date) {
|
|
105
|
+
if (date.length > 6) {
|
|
106
|
+
return this.formatDate(this.yyyymmddTimeToMoment(date));
|
|
107
|
+
}
|
|
108
|
+
return date;
|
|
109
|
+
}
|
|
110
|
+
formatDateToMMDDYYY(date) {
|
|
111
|
+
return moment(date).format(BaseHelperRoutines.MMDDYY_DATE);
|
|
112
|
+
}
|
|
113
|
+
formatDate(date) {
|
|
114
|
+
date = moment(date);
|
|
115
|
+
return date.format(BaseHelperRoutines.DATE_FORMAT);
|
|
116
|
+
}
|
|
117
|
+
formatTime(date) {
|
|
118
|
+
try {
|
|
119
|
+
return date.format(BaseHelperRoutines.TIME_FORMAT);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
console.error(e);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
formatTimeColon(date) {
|
|
126
|
+
date = moment(date);
|
|
127
|
+
return date.format(BaseHelperRoutines.TIME_FORMAT_COLON);
|
|
128
|
+
}
|
|
129
|
+
formatIsoDate(date) {
|
|
130
|
+
date = moment(date);
|
|
131
|
+
return date.format(BaseHelperRoutines.ISO_DATA_FORMAT);
|
|
132
|
+
}
|
|
133
|
+
formatIsoDateTime(date) {
|
|
134
|
+
date = moment(date);
|
|
135
|
+
return date.format(BaseHelperRoutines.ISO_DATA_FORMAT_TIME);
|
|
136
|
+
}
|
|
137
|
+
formatIsoDateNoHyphans(date) {
|
|
138
|
+
date = moment(date);
|
|
139
|
+
return date.format(BaseHelperRoutines.ISO_DATA_FORMAT_NO_HYPHANS);
|
|
140
|
+
}
|
|
141
|
+
generateTimesList(from = 0, to = 24, step = 15) {
|
|
142
|
+
const dateTimeArray = [];
|
|
143
|
+
for (let hour = 0; hour < to - from; hour++) {
|
|
144
|
+
for (let minute = 0; minute < 60; minute += step) {
|
|
145
|
+
dateTimeArray.push(moment({ hour, minute }).format('HH:mm'));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return dateTimeArray;
|
|
149
|
+
}
|
|
150
|
+
momentToNgDate(date) {
|
|
151
|
+
date = moment(date);
|
|
152
|
+
return this.dateToNgDate(date.toDate());
|
|
153
|
+
}
|
|
154
|
+
ngDateToDate(date) {
|
|
155
|
+
return new Date(date.year, date.month - 1, date.day);
|
|
156
|
+
}
|
|
157
|
+
ngDateToMoment(date, time) {
|
|
158
|
+
const mom = moment(this.ngDateToDate(date));
|
|
159
|
+
if (time) {
|
|
160
|
+
const times = time.split(':');
|
|
161
|
+
if (times.length === 2) {
|
|
162
|
+
mom.set('hours', Number(times[0])).set('minutes', Number(times[1]));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
mom
|
|
166
|
+
.set('hours', Number(time.substr(0, 2)))
|
|
167
|
+
.set('minutes', Number(time.substr(2, 2)));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return mom;
|
|
171
|
+
}
|
|
172
|
+
todayToNgbDateStruct() {
|
|
173
|
+
const today = moment();
|
|
174
|
+
return { year: today.year(), month: today.month() + 1, day: today.date() };
|
|
175
|
+
}
|
|
176
|
+
objectToArray(object) {
|
|
177
|
+
return Object.keys(object).map((i) => object[i]);
|
|
178
|
+
}
|
|
179
|
+
yyyymmddToDate(value) {
|
|
180
|
+
return new Date(Number(value.substring(0, 4)), Number(value.substring(4, 6)) - 1, Number(value.substring(6, 8)));
|
|
181
|
+
}
|
|
182
|
+
yyyymmddToMoment(value) {
|
|
183
|
+
return moment(this.yyyymmddToDate(value));
|
|
184
|
+
}
|
|
185
|
+
yymmddToMoment(value) {
|
|
186
|
+
return moment(value, 'YYMMDD');
|
|
187
|
+
}
|
|
188
|
+
yymmddToNgbDate(value) {
|
|
189
|
+
return this.momentToNgDate(this.yymmddToMoment(value));
|
|
190
|
+
}
|
|
191
|
+
yymmdd_hhmmToMoment(date, time) {
|
|
192
|
+
return moment(`${date} ${time}`, 'YYMMDD HHmm');
|
|
193
|
+
}
|
|
194
|
+
yyyymmdd_hhmmToMoment(date, time) {
|
|
195
|
+
return moment(`${date} ${time}`, 'YYYYMMDD HHmm');
|
|
196
|
+
}
|
|
197
|
+
yyyymmddToNgDate(value) {
|
|
198
|
+
return this.dateToNgDate(this.yyyymmddToDate(value));
|
|
199
|
+
}
|
|
200
|
+
yyyymmddTimeToNgDate(date, time) {
|
|
201
|
+
const dt = this.yyyymmddToMoment(date)
|
|
202
|
+
.add(Number(time.substring(0, 2)), 'hours')
|
|
203
|
+
.add(Number(time.substring(2, 4)), 'minutes');
|
|
204
|
+
return this.momentToNgDate(dt);
|
|
205
|
+
}
|
|
206
|
+
yyyymmddTimeToMoment(date) {
|
|
207
|
+
if (date.length === 6) {
|
|
208
|
+
return moment(`${date}`, 'YYMMDD');
|
|
209
|
+
}
|
|
210
|
+
return moment(`${date}`, 'YYYYMMDD');
|
|
211
|
+
}
|
|
212
|
+
hhmmToTime(value) {
|
|
213
|
+
return `${value.substring(0, 2)}:${value.substring(2, 4)}`;
|
|
214
|
+
}
|
|
215
|
+
dateStringToyyyymmdd(d) {
|
|
216
|
+
if (typeof d !== 'string') {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const m = /(\d{4})[-\/]?(\d{2})[-\/]?(\d{2})/.exec(d);
|
|
220
|
+
return m ? `${m[1]}${m[2]}${m[3]}` : null;
|
|
221
|
+
}
|
|
222
|
+
timeStringTohh_mm(t) {
|
|
223
|
+
if (typeof t !== 'string') {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
const m = /(\d{2})[:-]?(\d{2})/.exec(t);
|
|
227
|
+
return m ? `${m[1]}:${m[2]}` : null;
|
|
228
|
+
}
|
|
229
|
+
stringToBool(s) {
|
|
230
|
+
return s && s !== 'false' && s !== '0' && s !== 'no' && s !== 'n';
|
|
231
|
+
}
|
|
232
|
+
clone(toClone) {
|
|
233
|
+
return _.cloneDeep(toClone);
|
|
234
|
+
}
|
|
235
|
+
replaceKeysInText(text, replacements) {
|
|
236
|
+
return Object.keys(replacements).reduce((current, key) => {
|
|
237
|
+
return current.replace('%' + key, replacements[key]);
|
|
238
|
+
}, text);
|
|
239
|
+
}
|
|
240
|
+
getNextMinuets(date = moment(), minutesToRound = 15) {
|
|
241
|
+
date.minute(Math.ceil(date.minute() / minutesToRound) * minutesToRound);
|
|
242
|
+
return date.format('HH:mm');
|
|
243
|
+
}
|
|
244
|
+
/********************************************************************************************
|
|
245
|
+
* Below are functions needed for generating the hashed number once token, taken as required *
|
|
246
|
+
* Don't Mess with these *
|
|
247
|
+
********************************************************************************************/
|
|
248
|
+
getNumberOnceValue(token) {
|
|
249
|
+
const random_value = this.guid();
|
|
250
|
+
return random_value + '_' + hex_hmac_md5(token, random_value);
|
|
251
|
+
}
|
|
252
|
+
guid() {
|
|
253
|
+
let random_hex = '';
|
|
254
|
+
for (let i = 0; i < 32; i++) {
|
|
255
|
+
random_hex += this.s4();
|
|
256
|
+
}
|
|
257
|
+
return random_hex;
|
|
258
|
+
}
|
|
259
|
+
s4() {
|
|
260
|
+
return Math.floor((1 + Math.random()) * 0x10000)
|
|
261
|
+
.toString(16)
|
|
262
|
+
.substring(1);
|
|
263
|
+
}
|
|
264
|
+
capitaliseFirstLetter(word) {
|
|
265
|
+
if (word.length > 0) {
|
|
266
|
+
return word[0].toUpperCase() + word.slice(1).toLowerCase();
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
return '';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
fromObject(...args) {
|
|
273
|
+
let data = args.shift();
|
|
274
|
+
for (let index = 0; data && index < args.length; index += 1) {
|
|
275
|
+
data = data[args[index]];
|
|
276
|
+
}
|
|
277
|
+
return data;
|
|
278
|
+
}
|
|
279
|
+
momentRoundMinutes(time, round) {
|
|
280
|
+
time = moment(time).startOf('minutes');
|
|
281
|
+
let diff = time.minutes() % round;
|
|
282
|
+
if (diff !== 0) {
|
|
283
|
+
diff = round - diff;
|
|
284
|
+
}
|
|
285
|
+
return time.add(diff, 'minute');
|
|
286
|
+
}
|
|
287
|
+
round(date, duration) {
|
|
288
|
+
return moment(Math.ceil(+date / +duration) * +duration);
|
|
289
|
+
}
|
|
290
|
+
icsFold(body) {
|
|
291
|
+
const lines = body.split(/\r\n/g);
|
|
292
|
+
return lines
|
|
293
|
+
.map((line) => {
|
|
294
|
+
let res = '';
|
|
295
|
+
const n = 72;
|
|
296
|
+
line = line.trim();
|
|
297
|
+
while (line.length > n) {
|
|
298
|
+
res += `${line.slice(0, n)}\r\n`;
|
|
299
|
+
line = ` ${line.slice(n).trim()}`;
|
|
300
|
+
}
|
|
301
|
+
if (line.trim()) {
|
|
302
|
+
res += line;
|
|
303
|
+
}
|
|
304
|
+
return res;
|
|
305
|
+
})
|
|
306
|
+
.join('\r\n');
|
|
307
|
+
}
|
|
308
|
+
splitAddressLine(line, len) {
|
|
309
|
+
const res = {
|
|
310
|
+
line: line.replace(/\s+/g, ' ').trim(),
|
|
311
|
+
residue: ''
|
|
312
|
+
};
|
|
313
|
+
if (res.line.length > len) {
|
|
314
|
+
let i = res.line.slice(0, len).lastIndexOf(',');
|
|
315
|
+
if (i > 0) {
|
|
316
|
+
res.residue = res.line.slice(i + 1).trim();
|
|
317
|
+
res.line = res.line.slice(0, i).trim();
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
i = res.line.slice(0, len).lastIndexOf(' ');
|
|
321
|
+
if (i > 0) {
|
|
322
|
+
res.residue = res.line.slice(i + 1).trim();
|
|
323
|
+
res.line = res.line.slice(0, i);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
res.residue = res.line.slice(len);
|
|
327
|
+
res.line = res.line.slice(0, len);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return res;
|
|
332
|
+
}
|
|
333
|
+
daysBetween(start, end) {
|
|
334
|
+
return end.diff(start, 'days');
|
|
335
|
+
}
|
|
336
|
+
mapPromise(a, f, max) {
|
|
337
|
+
const it = a[Symbol.iterator]();
|
|
338
|
+
const result = [];
|
|
339
|
+
const buffer = [];
|
|
340
|
+
let i = 0;
|
|
341
|
+
const nextf = () => {
|
|
342
|
+
const next = it.next();
|
|
343
|
+
if (next.done) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const index = i++;
|
|
347
|
+
return Promise.resolve(f(next.value, index)).then((val) => {
|
|
348
|
+
result[index] = val;
|
|
349
|
+
return nextf();
|
|
350
|
+
});
|
|
351
|
+
};
|
|
352
|
+
while (!max || buffer.length <= max) {
|
|
353
|
+
const n = nextf();
|
|
354
|
+
if (n) {
|
|
355
|
+
buffer.push(n);
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return Promise.all(buffer).then(() => {
|
|
362
|
+
return result;
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
mapSeriesPromise(a, f) {
|
|
366
|
+
return this.mapPromise(a, f, 1);
|
|
367
|
+
}
|
|
368
|
+
obj2queryString(obj) {
|
|
369
|
+
return _.reduce(obj, (a, v, k) => {
|
|
370
|
+
if (a !== '') {
|
|
371
|
+
a += '&';
|
|
372
|
+
}
|
|
373
|
+
return `${a}${encodeURIComponent(k)}=${encodeURIComponent(v)}`;
|
|
374
|
+
}, '');
|
|
375
|
+
}
|
|
376
|
+
stripPunctuation(s) {
|
|
377
|
+
return s.replace(/[^a-zA-Z0-9\s]/g, '');
|
|
378
|
+
}
|
|
379
|
+
replaceAll(haystack, needle, replacement) {
|
|
380
|
+
return haystack
|
|
381
|
+
? haystack.replace(new RegExp(needle, 'g'), replacement)
|
|
382
|
+
: null;
|
|
383
|
+
}
|
|
384
|
+
dateTime(sabsDate, sabsTime) {
|
|
385
|
+
const tempDate = sabsDate.match(/.{1,2}/g); // splits every 2 characters
|
|
386
|
+
const tempTime = sabsTime.match(/.{1,2}/g);
|
|
387
|
+
const newStr = '20' +
|
|
388
|
+
tempDate[0] +
|
|
389
|
+
'-' +
|
|
390
|
+
tempDate[1] +
|
|
391
|
+
'-' +
|
|
392
|
+
tempDate[2] +
|
|
393
|
+
'T' +
|
|
394
|
+
tempTime[0] +
|
|
395
|
+
':' +
|
|
396
|
+
tempTime[1] +
|
|
397
|
+
':00';
|
|
398
|
+
return newStr;
|
|
399
|
+
}
|
|
400
|
+
alternateJSONStringify(jsonObject) {
|
|
401
|
+
let jsonString = JSON.stringify(jsonObject);
|
|
402
|
+
jsonString = jsonString.replace(/"/g, '`');
|
|
403
|
+
return jsonString;
|
|
404
|
+
}
|
|
405
|
+
// Convert object to array
|
|
406
|
+
ConvertObjectToArray(object) {
|
|
407
|
+
let array = _.values(object);
|
|
408
|
+
array = _.flatten(array);
|
|
409
|
+
return array;
|
|
410
|
+
}
|
|
411
|
+
addDay(dateStruct) {
|
|
412
|
+
const date = new Date(dateStruct.year, dateStruct.month - 1, dateStruct.day + 1);
|
|
413
|
+
const retDate = {
|
|
414
|
+
year: date.getFullYear(),
|
|
415
|
+
month: date.getMonth() + 1,
|
|
416
|
+
day: date.getDate()
|
|
417
|
+
};
|
|
418
|
+
//// console.log(retDate);
|
|
419
|
+
//// console.log(date);
|
|
420
|
+
return retDate;
|
|
421
|
+
}
|
|
422
|
+
hashCode(toCode) {
|
|
423
|
+
let hash = 0;
|
|
424
|
+
for (let i = 0; i < toCode.length; i += 1) {
|
|
425
|
+
const char = toCode.charCodeAt(i);
|
|
426
|
+
// tslint:disable-next-line: no-bitwise
|
|
427
|
+
hash = (hash << 5) - hash + char;
|
|
428
|
+
// tslint:disable-next-line: no-bitwise
|
|
429
|
+
hash = hash & hash;
|
|
430
|
+
}
|
|
431
|
+
return hash.toString();
|
|
432
|
+
}
|
|
433
|
+
MMddyyToNgb(date) {
|
|
434
|
+
return this.momentToNgDate(moment(date, BaseHelperRoutines.MMDDYY_DATE));
|
|
435
|
+
}
|
|
436
|
+
selectedChildrenTravellers(selectedTravellers, type) {
|
|
437
|
+
switch (type) {
|
|
438
|
+
// These types do not have a difference between adults and children. so always mark as adults.
|
|
439
|
+
case ServiceType.Hotel:
|
|
440
|
+
case ServiceType.Cab:
|
|
441
|
+
return [];
|
|
442
|
+
}
|
|
443
|
+
return selectedTravellers.filter((traveller) => traveller.isChild);
|
|
444
|
+
}
|
|
445
|
+
selectedTravellers(travellers, type) {
|
|
446
|
+
switch (type) {
|
|
447
|
+
// These types do not have a difference between adults and children. so always mark as adults.
|
|
448
|
+
case ServiceType.Hotel:
|
|
449
|
+
case ServiceType.Cab:
|
|
450
|
+
return { adults: travellers, children: [], infants: [] };
|
|
451
|
+
default:
|
|
452
|
+
return travellers.reduce((accum, traveller) => {
|
|
453
|
+
if (traveller.isChild) {
|
|
454
|
+
if (traveller.isInfant) {
|
|
455
|
+
accum.infants.push(traveller);
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
accum.children.push(traveller);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
accum.adults.push(traveller);
|
|
463
|
+
}
|
|
464
|
+
return accum;
|
|
465
|
+
}, {
|
|
466
|
+
adults: [],
|
|
467
|
+
children: [],
|
|
468
|
+
infants: []
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
selectedAdultTravellers(selectedTravellers, type) {
|
|
473
|
+
switch (type) {
|
|
474
|
+
// These types do not have a difference between adults and children. so always mark as adults.
|
|
475
|
+
case ServiceType.Hotel:
|
|
476
|
+
case ServiceType.Cab:
|
|
477
|
+
return selectedTravellers;
|
|
478
|
+
}
|
|
479
|
+
return selectedTravellers.filter((traveller) => !traveller.isChild && !traveller.isInfant);
|
|
480
|
+
}
|
|
481
|
+
_isChild(traveller, maxAge) {
|
|
482
|
+
if (traveller instanceof Date) {
|
|
483
|
+
const adultDate = moment().add(-maxAge, 'years');
|
|
484
|
+
return adultDate.isBefore(moment(traveller, BaseHelperRoutines.ISO_DATA_FORMAT), 'day');
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
return traveller.isChild;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
isChildFlight(traveller) {
|
|
491
|
+
return this._isChild(traveller, FLIGHT_MAX_CHILD_AGE_YEARS);
|
|
492
|
+
}
|
|
493
|
+
isChildRail(traveller) {
|
|
494
|
+
return this._isChild(traveller, RAIL_MAX_CHILD_AGE_YEARS);
|
|
495
|
+
}
|
|
496
|
+
isChildEurostar(traveller) {
|
|
497
|
+
return this._isChild(traveller, EUROSTAR_MAX_CHILD_AGE_YEARS);
|
|
498
|
+
}
|
|
499
|
+
uniqBy(array, value) {
|
|
500
|
+
return _.uniqBy(array, value);
|
|
501
|
+
}
|
|
502
|
+
isChild(traveller, travelType) {
|
|
503
|
+
switch (travelType) {
|
|
504
|
+
case ServiceType.Flight:
|
|
505
|
+
return this._isChild(traveller, FLIGHT_MAX_CHILD_AGE_YEARS);
|
|
506
|
+
case ServiceType.Rail:
|
|
507
|
+
return this._isChild(traveller, RAIL_MAX_CHILD_AGE_YEARS);
|
|
508
|
+
// case ServiceType.Eurostar:
|
|
509
|
+
// return this._isChild(traveller, EUROSTAR_MAX_CHILD_AGE_YEARS);
|
|
510
|
+
case ServiceType.Coach:
|
|
511
|
+
return this._isChild(traveller, COACH_MAX_CHILD_AGE_YEARS);
|
|
512
|
+
case ServiceType.Lounge:
|
|
513
|
+
return this._isChild(traveller, LOUNGES_MAX_CHILD_AGE_YEARS);
|
|
514
|
+
case ServiceType.Hotel:
|
|
515
|
+
case ServiceType.Cab:
|
|
516
|
+
return false;
|
|
517
|
+
default:
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
isInfant(traveller, travelType) {
|
|
522
|
+
switch (travelType) {
|
|
523
|
+
case ServiceType.Flight:
|
|
524
|
+
return this._isChild(traveller, FLIGHT_MAX_INFANT_AGE_YEARS);
|
|
525
|
+
case ServiceType.Rail:
|
|
526
|
+
return this._isChild(traveller, RAIL_MAX_INFANT_AGE_YEARS);
|
|
527
|
+
// case ServiceType.Eurostar:
|
|
528
|
+
// return this._isChild(traveller, EUROSTAR_MAX_CHILD_AGE_YEARS);
|
|
529
|
+
case ServiceType.Coach:
|
|
530
|
+
return this._isChild(traveller, COACH_MAX_INFANT_AGE_YEARS);
|
|
531
|
+
case ServiceType.Lounge:
|
|
532
|
+
return this._isChild(traveller, LOUNGES_MAX_INFANT_AGE_YEARS);
|
|
533
|
+
case ServiceType.Hotel:
|
|
534
|
+
case ServiceType.Cab:
|
|
535
|
+
return false;
|
|
536
|
+
default:
|
|
537
|
+
return false;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
getAgeType(traveller, travelType) {
|
|
541
|
+
return this.isChild(traveller, travelType) ? 'C' : 'A';
|
|
542
|
+
}
|
|
543
|
+
getMaxChildAge(type) {
|
|
544
|
+
switch (type) {
|
|
545
|
+
case ServiceType.Flight:
|
|
546
|
+
return moment()
|
|
547
|
+
.add(-FLIGHT_MAX_CHILD_AGE_YEARS + 1, 'years')
|
|
548
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
549
|
+
case ServiceType.Rail:
|
|
550
|
+
return moment()
|
|
551
|
+
.add(-RAIL_MAX_CHILD_AGE_YEARS + 1, 'years')
|
|
552
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
553
|
+
// case ServiceType.EUROSTAR:
|
|
554
|
+
// return moment().add(-EUROSTAR_MAX_CHILD_AGE_YEARS + 1, 'years').format(Helpers.MMDDYY_DATE);
|
|
555
|
+
case ServiceType.Coach:
|
|
556
|
+
return moment()
|
|
557
|
+
.add(-COACH_MAX_CHILD_AGE_YEARS + 1, 'years')
|
|
558
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
559
|
+
case ServiceType.Lounge:
|
|
560
|
+
return moment()
|
|
561
|
+
.add(-LOUNGES_MAX_CHILD_AGE_YEARS + 1, 'years')
|
|
562
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
getDefaultAdultAge(type) {
|
|
566
|
+
switch (type) {
|
|
567
|
+
case ServiceType.Flight:
|
|
568
|
+
return moment()
|
|
569
|
+
.add(-FLIGHT_MAX_CHILD_AGE_YEARS - 10, 'years')
|
|
570
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
571
|
+
case ServiceType.Rail:
|
|
572
|
+
return moment()
|
|
573
|
+
.add(-RAIL_MAX_CHILD_AGE_YEARS - 10, 'years')
|
|
574
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
575
|
+
// case ServiceType.Eurostar:
|
|
576
|
+
// return moment().add(-EUROSTAR_MAX_CHILD_AGE_YEARS - 10, 'years').format(Helpers.MMDDYY_DATE);
|
|
577
|
+
case ServiceType.Coach:
|
|
578
|
+
return moment()
|
|
579
|
+
.add(-COACH_MAX_CHILD_AGE_YEARS - 10, 'years')
|
|
580
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
581
|
+
case ServiceType.Lounge:
|
|
582
|
+
return moment()
|
|
583
|
+
.add(-LOUNGES_MAX_CHILD_AGE_YEARS - 10, 'years')
|
|
584
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
585
|
+
case ServiceType.Hotel:
|
|
586
|
+
case ServiceType.Cab:
|
|
587
|
+
// These types do not have child places so
|
|
588
|
+
return moment()
|
|
589
|
+
.add(-18, 'years')
|
|
590
|
+
.format(BaseHelperRoutines.MMDDYY_DATE);
|
|
591
|
+
}
|
|
592
|
+
return moment().add(-18, 'years').format(BaseHelperRoutines.MMDDYY_DATE);
|
|
593
|
+
}
|
|
594
|
+
transform(array, callback, acc) {
|
|
595
|
+
return _.transform(array, callback, acc);
|
|
596
|
+
}
|
|
597
|
+
arrayToObject(array, field) {
|
|
598
|
+
return array
|
|
599
|
+
.filter((data) => !!data)
|
|
600
|
+
.reduce((configs, configItem) => {
|
|
601
|
+
if (configItem && configItem[field]) {
|
|
602
|
+
configs[configItem[field]] = configItem;
|
|
603
|
+
return configs;
|
|
604
|
+
}
|
|
605
|
+
}, {});
|
|
606
|
+
}
|
|
607
|
+
arrayToObjectArray(array, field) {
|
|
608
|
+
return array
|
|
609
|
+
.filter((data) => !!data)
|
|
610
|
+
.reduce((configs, configItem) => {
|
|
611
|
+
if (configItem && configItem[field]) {
|
|
612
|
+
configs[configItem[field]] = configs[configItem[field]] || [];
|
|
613
|
+
configs[configItem[field]].push(configItem);
|
|
614
|
+
return configs;
|
|
615
|
+
}
|
|
616
|
+
}, {});
|
|
617
|
+
}
|
|
618
|
+
getTerminals(airport) {
|
|
619
|
+
return airport.terminals;
|
|
620
|
+
}
|
|
621
|
+
fieldFromObject(obj, field) {
|
|
622
|
+
return (field || '')
|
|
623
|
+
.split('.')
|
|
624
|
+
.reduce((current, field1) => {
|
|
625
|
+
if (current && current[field1]) {
|
|
626
|
+
return current[field1];
|
|
627
|
+
}
|
|
628
|
+
return '';
|
|
629
|
+
}, obj);
|
|
630
|
+
}
|
|
631
|
+
mapFieldFromObject(field) {
|
|
632
|
+
return (obj) => {
|
|
633
|
+
return obj[field];
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
removeNulls(query) {
|
|
637
|
+
return Object.keys(query).reduce((accum, key) => {
|
|
638
|
+
const value = query[key];
|
|
639
|
+
const data = Array.isArray(value)
|
|
640
|
+
? value.filter((item) => !!item) || null
|
|
641
|
+
: value;
|
|
642
|
+
if ((data !== null && data !== undefined && data !== 'null') ||
|
|
643
|
+
(Array.isArray(data) && data.length > 0)) {
|
|
644
|
+
accum[key] = data;
|
|
645
|
+
}
|
|
646
|
+
return accum;
|
|
647
|
+
}, {});
|
|
648
|
+
}
|
|
649
|
+
getTravellersId(travellers) {
|
|
650
|
+
if (travellers) {
|
|
651
|
+
return travellers.reduce((previousValue, currentValue, idx) => {
|
|
652
|
+
return idx === 0 ? [currentValue.id] : [...previousValue, currentValue.id];
|
|
653
|
+
}, []);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* loop over the query object param and convert any moment date objects to date-time strings
|
|
658
|
+
* @param query
|
|
659
|
+
* @param debug
|
|
660
|
+
*/
|
|
661
|
+
sanitizeMomentDates(query, debug = false) {
|
|
662
|
+
const sanitizedQuery = Object.assign({}, query);
|
|
663
|
+
for (const [key, value] of Object.entries(sanitizedQuery)) {
|
|
664
|
+
if (moment.isMoment(value)) {
|
|
665
|
+
sanitizedQuery[key] = sanitizedQuery[key].toISOString();
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
if (debug) {
|
|
669
|
+
console.log('-- sanitizeMomentDates() called --');
|
|
670
|
+
console.log('original query: ', query);
|
|
671
|
+
console.log('sanitized query: ', sanitizedQuery);
|
|
672
|
+
}
|
|
673
|
+
return sanitizedQuery;
|
|
674
|
+
}
|
|
675
|
+
toStrings(toFormat, schema) {
|
|
676
|
+
return Object.entries(schema.properties || {}).reduce((currentValue, [key, value]) => {
|
|
677
|
+
const newValue = this._formatValue(toFormat[key], value, (schema.required || []).includes(key));
|
|
678
|
+
if (newValue !== null) {
|
|
679
|
+
currentValue[key] = newValue;
|
|
680
|
+
}
|
|
681
|
+
return currentValue;
|
|
682
|
+
}, {});
|
|
683
|
+
}
|
|
684
|
+
_formatValue(value, schema, isRequired) {
|
|
685
|
+
switch (schema.type) {
|
|
686
|
+
case 'integer':
|
|
687
|
+
const tmp = Number.parseInt(value, 10);
|
|
688
|
+
return Number.isNaN(tmp) ? (isRequired ? 0 : null) : tmp;
|
|
689
|
+
case 'string':
|
|
690
|
+
const tmp1 = value ? value.toString() : null;
|
|
691
|
+
return tmp1 && tmp1.length > 0 ? tmp1 : isRequired ? '' : null;
|
|
692
|
+
case 'object':
|
|
693
|
+
return value ? this.toStrings(value, schema) : isRequired ? {} : null;
|
|
694
|
+
case 'array':
|
|
695
|
+
return value; // TODO write array translation
|
|
696
|
+
default:
|
|
697
|
+
return value;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
makeTimeWindow(dateTime, start, end) {
|
|
701
|
+
const startTime = dateTime.clone().add(start, 'hour');
|
|
702
|
+
const endTime = dateTime.clone().add(end, 'hour');
|
|
703
|
+
return this.formatTime(startTime) + '-' + this.formatTime(endTime);
|
|
704
|
+
}
|
|
705
|
+
inRange(tocheck, range) {
|
|
706
|
+
return tocheck >= range.min && tocheck <= range.max;
|
|
707
|
+
}
|
|
708
|
+
makeUsers(travellers) {
|
|
709
|
+
return travellers.map((traveller) => {
|
|
710
|
+
return {
|
|
711
|
+
id: traveller.id,
|
|
712
|
+
passengerType: traveller.isChild
|
|
713
|
+
? PassengerType.Child
|
|
714
|
+
: traveller.isInfant
|
|
715
|
+
? PassengerType.Infant
|
|
716
|
+
: PassengerType.Adult
|
|
717
|
+
};
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
makeMomentDayTime(addDay, hh, m) {
|
|
721
|
+
const dt = moment();
|
|
722
|
+
if (addDay !== undefined) {
|
|
723
|
+
dt.add(addDay, 'day');
|
|
724
|
+
}
|
|
725
|
+
if (hh !== undefined) {
|
|
726
|
+
dt.set('hours', hh);
|
|
727
|
+
}
|
|
728
|
+
if (m !== undefined) {
|
|
729
|
+
dt.set('minutes', m);
|
|
730
|
+
}
|
|
731
|
+
return dt;
|
|
732
|
+
}
|
|
733
|
+
sanatizeReturns(defaults, suppliedData, momentFields) {
|
|
734
|
+
const combined = Object.assign({}, defaults, suppliedData);
|
|
735
|
+
return (momentFields || []).reduce((current, next) => {
|
|
736
|
+
const value = current[next];
|
|
737
|
+
current[next] = !value
|
|
738
|
+
? moment()
|
|
739
|
+
: typeof value === 'string'
|
|
740
|
+
? moment(value)
|
|
741
|
+
: value;
|
|
742
|
+
return current;
|
|
743
|
+
}, combined);
|
|
744
|
+
}
|
|
745
|
+
miIsValid(toCheck) {
|
|
746
|
+
return (toCheck.length === 0 ||
|
|
747
|
+
!!toCheck.find((miItem) => {
|
|
748
|
+
return miItem.isValid();
|
|
749
|
+
}));
|
|
750
|
+
}
|
|
751
|
+
isMiValid(miPerItem, miPerUser) {
|
|
752
|
+
const userMis = Object.values(miPerUser || {});
|
|
753
|
+
return (this.miIsValid(miPerItem) &&
|
|
754
|
+
(userMis.length === 0 ||
|
|
755
|
+
!!userMis.find((userMis1) => {
|
|
756
|
+
return this.miIsValid(userMis1.managementInfo);
|
|
757
|
+
})));
|
|
758
|
+
}
|
|
759
|
+
needsMi(basket, needsToViewMi) {
|
|
760
|
+
return (basket.basketInfoMiDetails.length > 0 &&
|
|
761
|
+
(needsToViewMi ||
|
|
762
|
+
!basket.basketInfoMiDetails.find((miDetail) => {
|
|
763
|
+
return this.isMiValid(miDetail.miPerItem, miDetail.miPerUser);
|
|
764
|
+
})));
|
|
765
|
+
}
|
|
766
|
+
findService(services, id) {
|
|
767
|
+
return Object.values(services).reduce((current, service1) => {
|
|
768
|
+
return (current ||
|
|
769
|
+
service1.find((service2) => {
|
|
770
|
+
return service2.id === id;
|
|
771
|
+
}));
|
|
772
|
+
}, null);
|
|
773
|
+
}
|
|
774
|
+
allTrue(suppInfo, filter) {
|
|
775
|
+
return suppInfo.filter(filter).length === suppInfo.length;
|
|
776
|
+
}
|
|
777
|
+
joinFromAttribute(joinCharacter, attribute, array) {
|
|
778
|
+
return array.map((item) => item[attribute]).join(joinCharacter);
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* @description - split up an array into equal parts
|
|
782
|
+
* @param array - the array to split up
|
|
783
|
+
* @param size - the size of the constituant parts
|
|
784
|
+
* @param includeRemainder - wether or not to include any remaing results - default true
|
|
785
|
+
*/
|
|
786
|
+
splitUpArray(array, size, includeRemainder = true) {
|
|
787
|
+
const arrayCopy = _.cloneDeep(array); // lodash clone deep
|
|
788
|
+
let newArray = [];
|
|
789
|
+
if (arrayCopy.length > size) {
|
|
790
|
+
while (arrayCopy.length >= size) {
|
|
791
|
+
newArray.push(arrayCopy.splice(0, size));
|
|
792
|
+
}
|
|
793
|
+
// add any remaining
|
|
794
|
+
if (arrayCopy.length && includeRemainder) {
|
|
795
|
+
newArray.push(arrayCopy);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
else {
|
|
799
|
+
newArray = arrayCopy;
|
|
800
|
+
}
|
|
801
|
+
return newArray;
|
|
802
|
+
}
|
|
803
|
+
getTimeDifference(depDateTime, arrDateTime) {
|
|
804
|
+
return moment(depDateTime).diff(moment(arrDateTime), 'minutes');
|
|
805
|
+
}
|
|
806
|
+
dayDifference(dept, arr) {
|
|
807
|
+
const diff = moment(arr)
|
|
808
|
+
.startOf('day')
|
|
809
|
+
.diff(moment(dept).startOf('day'), 'day');
|
|
810
|
+
return diff > 0 ? diff.toString() : '';
|
|
811
|
+
}
|
|
812
|
+
makeFareRules(flight, direction) {
|
|
813
|
+
const flights = direction === FlightDirectionEnum.Outbound
|
|
814
|
+
? flight.outboundFlights
|
|
815
|
+
: flight.inboundFlights;
|
|
816
|
+
const rules = flights.reduce((current, next) => {
|
|
817
|
+
var _a, _b, _c, _d, _e;
|
|
818
|
+
current.cancellation = current.cancellation.concat(((_a = next.fareConditions) === null || _a === void 0 ? void 0 : _a.cancellation) || []);
|
|
819
|
+
current.change = current.change.concat(((_b = next.fareConditions) === null || _b === void 0 ? void 0 : _b.change) || []);
|
|
820
|
+
current.noShow = current.noShow.concat(((_c = next.fareConditions) === null || _c === void 0 ? void 0 : _c.noShow) || []);
|
|
821
|
+
current.upgrade = current.upgrade.concat(((_d = next.fareConditions) === null || _d === void 0 ? void 0 : _d.upgrade) || []);
|
|
822
|
+
current.other = current.other.concat(((_e = next.fareConditions) === null || _e === void 0 ? void 0 : _e.other) || []);
|
|
823
|
+
return current;
|
|
824
|
+
}, {
|
|
825
|
+
cancellation: [],
|
|
826
|
+
change: [],
|
|
827
|
+
noShow: [],
|
|
828
|
+
upgrade: [],
|
|
829
|
+
other: []
|
|
830
|
+
});
|
|
831
|
+
return { rules, flights };
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* @desc - generates ics file content
|
|
835
|
+
*/
|
|
836
|
+
generateIcsFileContents(basketItems) {
|
|
837
|
+
const icsBodyContent = this.generateIcsFileBodyContent(basketItems);
|
|
838
|
+
return [
|
|
839
|
+
'BEGIN:VCALENDAR\r\n',
|
|
840
|
+
'PRODID:-//Micros Travel//SABS Corporate - MMXIII//EN\r\n',
|
|
841
|
+
'VERSION:2.0\r\n',
|
|
842
|
+
'METHOD:REQUEST\r\n',
|
|
843
|
+
icsBodyContent,
|
|
844
|
+
'END:VCALENDAR\r\n'
|
|
845
|
+
].join('');
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* @desc - generates ics file body content based on the provided basketItems param
|
|
849
|
+
*/
|
|
850
|
+
generateIcsFileBodyContent(basketItems) {
|
|
851
|
+
// TODO: currently only basket items with ServiceType.Lounge are handled. See below to TODOs for remaining tasks
|
|
852
|
+
const bodyContent = [];
|
|
853
|
+
// generate calendar data for each basket item
|
|
854
|
+
basketItems.map((basketItem, index) => {
|
|
855
|
+
const data = {
|
|
856
|
+
dStart: '',
|
|
857
|
+
dEnd: '',
|
|
858
|
+
locationFrom: '',
|
|
859
|
+
locationTo: '',
|
|
860
|
+
basketId: '',
|
|
861
|
+
description: '',
|
|
862
|
+
serviceType: '',
|
|
863
|
+
summary: ''
|
|
864
|
+
};
|
|
865
|
+
const { type } = basketItem.service;
|
|
866
|
+
// populate data object depending on the service type in the basket
|
|
867
|
+
switch (type) {
|
|
868
|
+
case ServiceType.Lounge:
|
|
869
|
+
const { adults, children, bookingThirdPartyReference, detail, service } = basketItem;
|
|
870
|
+
data.basketId = basketItem.id;
|
|
871
|
+
data.dStart = detail === null || detail === void 0 ? void 0 : detail.arrivalDatetime;
|
|
872
|
+
data.dEnd = '';
|
|
873
|
+
data.summary = `Airport Lounge - ${detail.name}`;
|
|
874
|
+
data.serviceType = service.type.toLowerCase();
|
|
875
|
+
data.description = [
|
|
876
|
+
`Lounge: ${detail.name}\r\n`,
|
|
877
|
+
`Starts: ${detail.arrivalDatetime}\r\n`,
|
|
878
|
+
`Adults: ${adults}\r\n`,
|
|
879
|
+
`Children: ${children}\r\n`,
|
|
880
|
+
`Booking Ref: ${bookingThirdPartyReference}`
|
|
881
|
+
].join('');
|
|
882
|
+
break;
|
|
883
|
+
case ServiceType.Cab:
|
|
884
|
+
// TODO: handle this case
|
|
885
|
+
// hint: see logic in icalendar.component.ts file on lighting current version
|
|
886
|
+
case ServiceType.Car:
|
|
887
|
+
// TODO: handle this case
|
|
888
|
+
case ServiceType.Coach:
|
|
889
|
+
// TODO: handle this case
|
|
890
|
+
case ServiceType.FastTrack:
|
|
891
|
+
// TODO: handle this case
|
|
892
|
+
case ServiceType.Flight:
|
|
893
|
+
// TODO: handle this case
|
|
894
|
+
case ServiceType.Hotel:
|
|
895
|
+
// TODO: handle this case
|
|
896
|
+
case ServiceType.InternationalRail:
|
|
897
|
+
// TODO: handle this case
|
|
898
|
+
case ServiceType.Parking:
|
|
899
|
+
// TODO: handle this case
|
|
900
|
+
case ServiceType.Rail:
|
|
901
|
+
// TODO: handle this case
|
|
902
|
+
}
|
|
903
|
+
bodyContent.push([
|
|
904
|
+
'BEGIN:VEVENT\r\n',
|
|
905
|
+
data.dStart
|
|
906
|
+
? `DTSTART:${moment(data.dStart).format('YYYYMMDDTHHmmss')}\r\n`
|
|
907
|
+
: '',
|
|
908
|
+
data.dEnd
|
|
909
|
+
? `DTEND:${moment(data.dEnd).format('YYYYMMDDTHHmmss')}\r\n`
|
|
910
|
+
: '',
|
|
911
|
+
'ORGANIZER;CN="Do not reply to this email":mailto:do_not_reply@sabscorp.com\r\n',
|
|
912
|
+
data.locationTo && data.locationFrom
|
|
913
|
+
? `LOCATION: ${data.locationTo} to ${data.locationFrom} \r\n`
|
|
914
|
+
: '',
|
|
915
|
+
'TRANSP:OPAQUE\r\n',
|
|
916
|
+
'SEQUENCE:0\r\n',
|
|
917
|
+
`UID:${data.serviceType}_${index}_${data.basketId}@sabscorp.com\r\n`,
|
|
918
|
+
`DTSTAMP:${moment().format('YYYYMMDDTHHmmss')}\r\n`,
|
|
919
|
+
`DESCRIPTION:${data.description}\r\n`,
|
|
920
|
+
`SUMMARY:${data.summary}\r\n`,
|
|
921
|
+
'END:VEVENT\r\n'
|
|
922
|
+
].join(''));
|
|
923
|
+
});
|
|
924
|
+
return bodyContent.join('');
|
|
925
|
+
}
|
|
926
|
+
/**
|
|
927
|
+
* @desc - creates an element in memory and triggers click event to download ics file
|
|
928
|
+
*/
|
|
929
|
+
downloadIcs(filename, text) {
|
|
930
|
+
const element = document.createElement('a');
|
|
931
|
+
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
|
932
|
+
element.setAttribute('download', filename);
|
|
933
|
+
element.setAttribute('target', '_blank');
|
|
934
|
+
element.style.display = 'none';
|
|
935
|
+
element.click();
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* @description - split a string on capitals
|
|
939
|
+
* @param rawString - the string we want to split
|
|
940
|
+
* @param join - whether or not to joing the split into one string, seperated by a space
|
|
941
|
+
* @returns string/string[]
|
|
942
|
+
*/
|
|
943
|
+
splitStringOnCapitals(rawString, join = false) {
|
|
944
|
+
const splitString = rawString.split(/(?=[A-Z])/);
|
|
945
|
+
if (join) {
|
|
946
|
+
return splitString.join(' ');
|
|
947
|
+
}
|
|
948
|
+
return splitString;
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
BaseHelperRoutines.READ_DATE_FORMAT = 'dd, D MMM YYYY';
|
|
952
|
+
BaseHelperRoutines.READ_TIME_FORMAT = 'HH:mm';
|
|
953
|
+
BaseHelperRoutines.DATE_FORMAT = 'YYMMDD';
|
|
954
|
+
BaseHelperRoutines.ISO_DATA_FORMAT = 'YYYY-MM-DD';
|
|
955
|
+
BaseHelperRoutines.ISO_DATA_FORMAT_TIME = 'YYYY-MM-DD HH:mm';
|
|
956
|
+
BaseHelperRoutines.ISO_DATA_FORMAT_NO_HYPHANS = 'YYYYMMDD';
|
|
957
|
+
BaseHelperRoutines.TIME_FORMAT = 'HHmm';
|
|
958
|
+
BaseHelperRoutines.TIME_FORMAT_COLON = 'HH:mm';
|
|
959
|
+
BaseHelperRoutines.MMDDYY_DATE = 'DDMMYYYY';
|
|
960
|
+
__decorate([
|
|
961
|
+
Memorise(),
|
|
962
|
+
__metadata("design:type", Function),
|
|
963
|
+
__metadata("design:paramtypes", [String, String]),
|
|
964
|
+
__metadata("design:returntype", Number)
|
|
965
|
+
], BaseHelperRoutines.prototype, "getTimeDifference", null);
|
|
966
|
+
__decorate([
|
|
967
|
+
Memorise(),
|
|
968
|
+
__metadata("design:type", Function),
|
|
969
|
+
__metadata("design:paramtypes", [String, String]),
|
|
970
|
+
__metadata("design:returntype", String)
|
|
971
|
+
], BaseHelperRoutines.prototype, "dayDifference", null);
|
|
972
|
+
__decorate([
|
|
973
|
+
Memorise(),
|
|
974
|
+
__metadata("design:type", Function),
|
|
975
|
+
__metadata("design:paramtypes", [Object, Number]),
|
|
976
|
+
__metadata("design:returntype", void 0)
|
|
977
|
+
], BaseHelperRoutines.prototype, "makeFareRules", null);
|
|
978
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3IvY2xhc3Nlcy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBVXZCLE9BQU8sRUFDTCxtQkFBbUIsRUFJcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBTUwsYUFBYSxFQUViLFdBQVcsRUFFWixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUlqRCxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUN0QyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUNwQyxNQUFNLDRCQUE0QixHQUFHLEVBQUUsQ0FBQztBQUN4QyxNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztBQUNyQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQztBQUN0QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUNyQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUV2QyxNQUFNLE1BQU0sR0FBRztJQUNiLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztDQUNOLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRztJQUNsQixTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07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QUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FDbkIsU0FBaUIsRUFDakIsT0FBZ0IsS0FBSztRQUVyQixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpELElBQUksSUFBSSxFQUFFO1lBQ1IsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzlCO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQzs7QUF6bkNNLG1DQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQ3BDLG1DQUFnQixHQUFHLE9BQU8sQ0FBQztBQUMzQiw4QkFBVyxHQUFHLFFBQVEsQ0FBQztBQUN2QixrQ0FBZSxHQUFHLFlBQVksQ0FBQztBQUMvQix1Q0FBb0IsR0FBRyxrQkFBa0IsQ0FBQztBQUMxQyw2Q0FBMEIsR0FBRyxVQUFVLENBQUM7QUFDeEMsOEJBQVcsR0FBRyxNQUFNLENBQUM7QUFDckIsb0NBQWlCLEdBQUcsT0FBTyxDQUFDO0FBQzVCLDhCQUFXLEdBQUcsVUFBVSxDQUFDO0FBdTdCaEM7SUFEQyxRQUFRLEVBQUU7Ozs7MkRBR1Y7QUFHRDtJQURDLFFBQVEsRUFBRTs7Ozt1REFNVjtBQUdEO0lBREMsUUFBUSxFQUFFOzs7O3VEQWdDViIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFza2V0RGV0YWlscyxcclxuICBCYXNrZXRJdGVtTWFuYWdlbWVudEluZm9cclxufSBmcm9tICcuLi9zZXJ2aWNlcy9lbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkIH0gZnJvbSAnLi9tYW5hZ2VtZW50LWluZm8tYW5kLXZhbGlkJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2VzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBGbGlnaHREaXJlY3Rpb25FbnVtLFxyXG4gIE1pbk1heCxcclxuICBOZ2JEYXRlU3RydWN0LFxyXG4gIFNjaGVtYVxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBBaXJwb3J0LFxyXG4gIEJhc2tldEl0ZW0sXHJcbiAgRmFyZUNvbmRpdGlvbnMsXHJcbiAgRmxpZ2h0SXRpbmVyYXJ5LFxyXG4gIEZsaWdodEpvdXJuZXksXHJcbiAgUGFzc2VuZ2VyVHlwZSxcclxuICBTZXJ2aWNlLFxyXG4gIFNlcnZpY2VUeXBlLFxyXG4gIFVzZXJQYXNzZW5nZXJUeXBlSW5wdXRcclxufSBmcm9tICcuLi90eXBlcy9ncmFwaHFsLnR5cGVzJztcclxuaW1wb3J0IHsgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc3VwcGxlbWVudGFyeS1ib29raW5nLWluZm8taW1wbCc7XHJcbmltcG9ydCB7IE1lbW9yaXNlIH0gZnJvbSAnLi9saW1pdGVkLWNhY2hlLmNsYXNzJztcclxuXHJcbmRlY2xhcmUgdmFyIGhleF9obWFjX21kNTogYW55O1xyXG5cclxuY29uc3QgRkxJR0hUX01BWF9DSElMRF9BR0VfWUVBUlMgPSAxNjtcclxuY29uc3QgUkFJTF9NQVhfQ0hJTERfQUdFX1lFQVJTID0gMTI7XHJcbmNvbnN0IEVVUk9TVEFSX01BWF9DSElMRF9BR0VfWUVBUlMgPSAxMjtcclxuY29uc3QgQ09BQ0hfTUFYX0NISUxEX0FHRV9ZRUFSUyA9IDE1O1xyXG5jb25zdCBMT1VOR0VTX01BWF9DSElMRF9BR0VfWUVBUlMgPSAxMjtcclxuY29uc3QgRkxJR0hUX01BWF9JTkZBTlRfQUdFX1lFQVJTID0gMDtcclxuY29uc3QgUkFJTF9NQVhfSU5GQU5UX0FHRV9ZRUFSUyA9IDA7XHJcbmNvbnN0IENPQUNIX01BWF9JTkZBTlRfQUdFX1lFQVJTID0gMDtcclxuY29uc3QgTE9VTkdFU19NQVhfSU5GQU5UX0FHRV9ZRUFSUyA9IDA7XHJcblxyXG5jb25zdCBtb250aHMgPSBbXHJcbiAgJ0phbicsXHJcbiAgJ0ZlYicsXHJcbiAgJ01hcicsXHJcbiAgJ0FwcicsXHJcbiAgJ01heScsXHJcbiAgJ0p1bicsXHJcbiAgJ0p1bCcsXHJcbiAgJ0F1ZycsXHJcbiAgJ1NlcCcsXHJcbiAgJ09jdCcsXHJcbiAgJ05vdicsXHJcbiAgJ0RlYydcclxuXTtcclxuXHJcbmNvbnN0IGZ1bGxfbW9udGhzID0gW1xyXG4gICdKYW51YXJ5JyxcclxuICAnRmVicnVhcnknLFxyXG4gICdNYXJjaCcsXHJcbiAgJ0FwcmlsJyxcclxuICAnTWF5JyxcclxuICAnSnVuZScsXHJcbiAgJ0p1bHknLFxyXG4gICdBdWd1c3QnLFxyXG4gICdTZXB0ZW1iZXInLFxyXG4gICdPY3RvYmVyJyxcclxuICAnTm92ZW1iZXInLFxyXG4gICdEZWNlbWJlcidcclxuXTtcclxuXHJcbmNvbnN0IHdlZWtkYXlzID0gWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXTtcclxuXHJcbmNvbnN0IGZ1bGxfd2Vla2RheXMgPSBbXHJcbiAgJ1N1bmRheScsXHJcbiAgJ01vbmRheScsXHJcbiAgJ1R1ZXNkYXknLFxyXG4gICdXZWRuZXNkYXknLFxyXG4gICdUaHVyc2RheScsXHJcbiAgJ0ZyaWRheScsXHJcbiAgJ1NhdHVyZGF5J1xyXG5dO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2VIZWxwZXJSb3V0aW5lcyB7XHJcbiAgc3RhdGljIFJFQURfREFURV9GT1JNQVQgPSAnZGQsIEQgTU1NIFlZWVknO1xyXG4gIHN0YXRpYyBSRUFEX1RJTUVfRk9STUFUID0gJ0hIOm1tJztcclxuICBzdGF0aWMgREFURV9GT1JNQVQgPSAnWVlNTUREJztcclxuICBzdGF0aWMgSVNPX0RBVEFfRk9STUFUID0gJ1lZWVktTU0tREQnO1xyXG4gIHN0YXRpYyBJU09fREFUQV9GT1JNQVRfVElNRSA9ICdZWVlZLU1NLUREIEhIOm1tJztcclxuICBzdGF0aWMgSVNPX0RBVEFfRk9STUFUX05PX0hZUEhBTlMgPSAnWVlZWU1NREQnO1xyXG4gIHN0YXRpYyBUSU1FX0ZPUk1BVCA9ICdISG1tJztcclxuICBzdGF0aWMgVElNRV9GT1JNQVRfQ09MT04gPSAnSEg6bW0nO1xyXG4gIHN0YXRpYyBNTUREWVlfREFURSA9ICdERE1NWVlZWSc7XHJcblxyXG4gIG1pblRvSG91cihkdXI6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGAke01hdGguZmxvb3IoZHVyIC8gNjApfWggJHtkdXIgJSA2MH1tYDtcclxuICB9XHJcblxyXG4gIG1ha2VDb2xvblRpbWUodGltZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGltZS5zdWJzdHJpbmcoMCwgMikgKyAnOicgKyB0aW1lLnN1YnN0cmluZygyLCA0KTtcclxuICB9XHJcblxyXG4gIG5vbk51bGxNaW4oa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICByZXR1cm4gYXJncy5yZWR1Y2UoXHJcbiAgICAgIChjdXJyZW50LCBpdGVtKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbVtrZXldKSB7XHJcbiAgICAgICAgICBpZiAoY3VycmVudC5taW4gPiBOdW1iZXIoaXRlbVtrZXldKSkge1xyXG4gICAgICAgICAgICByZXR1cm4geyBpdGVtLCBtaW46IE51bWJlcihpdGVtW2tleV0pIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICB9LFxyXG4gICAgICB7IG1pbjogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIGl0ZW06IG51bGwgfVxyXG4gICAgKS5pdGVtO1xyXG4gIH1cclxuXHJcbiAgam9pbkJ5Q29tbWEoLi4uYXR0cmlidXRlczogYW55W10pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNcclxuICAgICAgLnJlZHVjZSgoYWNjLCBhdHRyKSA9PiB7XHJcbiAgICAgICAgaWYgKF8uaXNFbXB0eShhdHRyKSkge1xyXG4gICAgICAgICAgYWNjICs9IGF0dHIgKyAnLCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgIH0sICcnKVxyXG4gICAgICAuc2xpY2UoMCwgLTEpO1xyXG4gIH1cclxuXHJcbiAgbXV0dWFsbHlJbmNsdWRlKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYS5pbmNsdWRlcyhiKSB8fCBiLmluY2x1ZGVzKGEpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1RyeWluZyB0byBtdXR1YWxseSBjb21wYXJlIHVuZGVmaW5lZCB2YXJpYWJsZS4nKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluZEJ5S2V5KGFycmF5OiBhbnlbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIGFycmF5XHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4gaXRlbVtrZXldID09PSB2YWx1ZTtcclxuICAgICAgfSlcclxuICAgICAgLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgZGF0ZVRvTmdEYXRlKGRhdGU6IERhdGUpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgbW9udGg6IGRhdGUuZ2V0TW9udGgoKSArIDEsXHJcbiAgICAgIGRheTogZGF0ZS5nZXREYXRlKClcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0VG9ZWU1NREQoZGF0ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoZGF0ZS5sZW5ndGggPiA2KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy55eXl5bW1kZFRpbWVUb01vbWVudChkYXRlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcblxyXG4gIGZvcm1hdERhdGVUb01NRERZWVkoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdChCYXNlSGVscGVyUm91dGluZXMuTU1ERFlZX0RBVEUpO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZShkYXRlOiBtb21lbnQuTW9tZW50KTogc3RyaW5nIHtcclxuICAgIGRhdGUgPSBtb21lbnQoZGF0ZSk7XHJcbiAgICByZXR1cm4gZGF0ZS5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLkRBVEVfRk9STUFUKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdFRpbWUoZGF0ZTogbW9tZW50Lk1vbWVudCk6IHN0cmluZyB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gZGF0ZS5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLlRJTUVfRk9STUFUKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvcm1hdFRpbWVDb2xvbihkYXRlOiBtb21lbnQuTW9tZW50KTogc3RyaW5nIHtcclxuICAgIGRhdGUgPSBtb21lbnQoZGF0ZSk7XHJcbiAgICByZXR1cm4gZGF0ZS5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLlRJTUVfRk9STUFUX0NPTE9OKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdElzb0RhdGUoZGF0ZTogbW9tZW50Lk1vbWVudCk6IHN0cmluZyB7XHJcbiAgICBkYXRlID0gbW9tZW50KGRhdGUpO1xyXG4gICAgcmV0dXJuIGRhdGUuZm9ybWF0KEJhc2VIZWxwZXJSb3V0aW5lcy5JU09fREFUQV9GT1JNQVQpO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0SXNvRGF0ZVRpbWUoZGF0ZTogbW9tZW50Lk1vbWVudCk6IHN0cmluZyB7XHJcbiAgICBkYXRlID0gbW9tZW50KGRhdGUpO1xyXG4gICAgcmV0dXJuIGRhdGUuZm9ybWF0KEJhc2VIZWxwZXJSb3V0aW5lcy5JU09fREFUQV9GT1JNQVRfVElNRSk7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRJc29EYXRlTm9IeXBoYW5zKGRhdGU6IG1vbWVudC5Nb21lbnQpOiBzdHJpbmcge1xyXG4gICAgZGF0ZSA9IG1vbWVudChkYXRlKTtcclxuICAgIHJldHVybiBkYXRlLmZvcm1hdChCYXNlSGVscGVyUm91dGluZXMuSVNPX0RBVEFfRk9STUFUX05PX0hZUEhBTlMpO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVUaW1lc0xpc3QoZnJvbSA9IDAsIHRvID0gMjQsIHN0ZXAgPSAxNSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGRhdGVUaW1lQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGxldCBob3VyID0gMDsgaG91ciA8IHRvIC0gZnJvbTsgaG91cisrKSB7XHJcbiAgICAgIGZvciAobGV0IG1pbnV0ZSA9IDA7IG1pbnV0ZSA8IDYwOyBtaW51dGUgKz0gc3RlcCkge1xyXG4gICAgICAgIGRhdGVUaW1lQXJyYXkucHVzaChtb21lbnQoeyBob3VyLCBtaW51dGUgfSkuZm9ybWF0KCdISDptbScpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGVUaW1lQXJyYXk7XHJcbiAgfVxyXG5cclxuICBtb21lbnRUb05nRGF0ZShkYXRlOiBtb21lbnQuTW9tZW50KTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICBkYXRlID0gbW9tZW50KGRhdGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZVRvTmdEYXRlKGRhdGUudG9EYXRlKCkpO1xyXG4gIH1cclxuXHJcbiAgbmdEYXRlVG9EYXRlKGRhdGU6IE5nYkRhdGVTdHJ1Y3QpOiBEYXRlIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLnllYXIsIGRhdGUubW9udGggLSAxLCBkYXRlLmRheSk7XHJcbiAgfVxyXG5cclxuICBuZ0RhdGVUb01vbWVudChkYXRlOiBOZ2JEYXRlU3RydWN0LCB0aW1lPzogc3RyaW5nKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICBjb25zdCBtb20gPSBtb21lbnQodGhpcy5uZ0RhdGVUb0RhdGUoZGF0ZSkpO1xyXG4gICAgaWYgKHRpbWUpIHtcclxuICAgICAgY29uc3QgdGltZXMgPSB0aW1lLnNwbGl0KCc6Jyk7XHJcbiAgICAgIGlmICh0aW1lcy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICBtb20uc2V0KCdob3VycycsIE51bWJlcih0aW1lc1swXSkpLnNldCgnbWludXRlcycsIE51bWJlcih0aW1lc1sxXSkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vbVxyXG4gICAgICAgICAgLnNldCgnaG91cnMnLCBOdW1iZXIodGltZS5zdWJzdHIoMCwgMikpKVxyXG4gICAgICAgICAgLnNldCgnbWludXRlcycsIE51bWJlcih0aW1lLnN1YnN0cigyLCAyKSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9tO1xyXG4gIH1cclxuXHJcbiAgdG9kYXlUb05nYkRhdGVTdHJ1Y3QoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICBjb25zdCB0b2RheSA9IG1vbWVudCgpO1xyXG4gICAgcmV0dXJuIHsgeWVhcjogdG9kYXkueWVhcigpLCBtb250aDogdG9kYXkubW9udGgoKSArIDEsIGRheTogdG9kYXkuZGF0ZSgpIH07XHJcbiAgfVxyXG5cclxuICBvYmplY3RUb0FycmF5KG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pik6IEFycmF5PGFueT4ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubWFwKChpKSA9PiBvYmplY3RbaV0pO1xyXG4gIH1cclxuXHJcbiAgeXl5eW1tZGRUb0RhdGUodmFsdWU6IHN0cmluZyk6IERhdGUge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKFxyXG4gICAgICBOdW1iZXIodmFsdWUuc3Vic3RyaW5nKDAsIDQpKSxcclxuICAgICAgTnVtYmVyKHZhbHVlLnN1YnN0cmluZyg0LCA2KSkgLSAxLFxyXG4gICAgICBOdW1iZXIodmFsdWUuc3Vic3RyaW5nKDYsIDgpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHl5eXltbWRkVG9Nb21lbnQodmFsdWU6IHN0cmluZyk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIG1vbWVudCh0aGlzLnl5eXltbWRkVG9EYXRlKHZhbHVlKSk7XHJcbiAgfVxyXG5cclxuICB5eW1tZGRUb01vbWVudCh2YWx1ZTogc3RyaW5nKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gbW9tZW50KHZhbHVlLCAnWVlNTUREJyk7XHJcbiAgfVxyXG5cclxuICB5eW1tZGRUb05nYkRhdGUodmFsdWU6IHN0cmluZyk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMubW9tZW50VG9OZ0RhdGUodGhpcy55eW1tZGRUb01vbWVudCh2YWx1ZSkpO1xyXG4gIH1cclxuXHJcbiAgeXltbWRkX2hobW1Ub01vbWVudChkYXRlOiBzdHJpbmcsIHRpbWU6IHN0cmluZyk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIG1vbWVudChgJHtkYXRlfSAke3RpbWV9YCwgJ1lZTU1ERCBISG1tJyk7XHJcbiAgfVxyXG5cclxuICB5eXl5bW1kZF9oaG1tVG9Nb21lbnQoZGF0ZTogc3RyaW5nLCB0aW1lOiBzdHJpbmcpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiBtb21lbnQoYCR7ZGF0ZX0gJHt0aW1lfWAsICdZWVlZTU1ERCBISG1tJyk7XHJcbiAgfVxyXG5cclxuICB5eXl5bW1kZFRvTmdEYXRlKHZhbHVlOiBzdHJpbmcpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGVUb05nRGF0ZSh0aGlzLnl5eXltbWRkVG9EYXRlKHZhbHVlKSk7XHJcbiAgfVxyXG5cclxuICB5eXl5bW1kZFRpbWVUb05nRGF0ZShkYXRlOiBzdHJpbmcsIHRpbWU6IHN0cmluZyk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgY29uc3QgZHQgPSB0aGlzLnl5eXltbWRkVG9Nb21lbnQoZGF0ZSlcclxuICAgICAgLmFkZChOdW1iZXIodGltZS5zdWJzdHJpbmcoMCwgMikpLCAnaG91cnMnKVxyXG4gICAgICAuYWRkKE51bWJlcih0aW1lLnN1YnN0cmluZygyLCA0KSksICdtaW51dGVzJyk7XHJcbiAgICByZXR1cm4gdGhpcy5tb21lbnRUb05nRGF0ZShkdCk7XHJcbiAgfVxyXG5cclxuICB5eXl5bW1kZFRpbWVUb01vbWVudChkYXRlOiBzdHJpbmcpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIGlmIChkYXRlLmxlbmd0aCA9PT0gNikge1xyXG4gICAgICByZXR1cm4gbW9tZW50KGAke2RhdGV9YCwgJ1lZTU1ERCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vbWVudChgJHtkYXRlfWAsICdZWVlZTU1ERCcpO1xyXG4gIH1cclxuXHJcbiAgaGhtbVRvVGltZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHt2YWx1ZS5zdWJzdHJpbmcoMCwgMil9OiR7dmFsdWUuc3Vic3RyaW5nKDIsIDQpfWA7XHJcbiAgfVxyXG5cclxuICBkYXRlU3RyaW5nVG95eXl5bW1kZChkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICh0eXBlb2YgZCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtID0gLyhcXGR7NH0pWy1cXC9dPyhcXGR7Mn0pWy1cXC9dPyhcXGR7Mn0pLy5leGVjKGQpO1xyXG4gICAgcmV0dXJuIG0gPyBgJHttWzFdfSR7bVsyXX0ke21bM119YCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICB0aW1lU3RyaW5nVG9oaF9tbSh0OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICh0eXBlb2YgdCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtID0gLyhcXGR7Mn0pWzotXT8oXFxkezJ9KS8uZXhlYyh0KTtcclxuICAgIHJldHVybiBtID8gYCR7bVsxXX06JHttWzJdfWAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgc3RyaW5nVG9Cb29sKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHMgJiYgcyAhPT0gJ2ZhbHNlJyAmJiBzICE9PSAnMCcgJiYgcyAhPT0gJ25vJyAmJiBzICE9PSAnbic7XHJcbiAgfVxyXG5cclxuICBjbG9uZTxUID0gYW55Pih0b0Nsb25lOiBUKTogVCB7XHJcbiAgICByZXR1cm4gXy5jbG9uZURlZXAodG9DbG9uZSkgYXMgVDtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VLZXlzSW5UZXh0KFxyXG4gICAgdGV4dDogc3RyaW5nLFxyXG4gICAgcmVwbGFjZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLnJlZHVjZSgoY3VycmVudCwga2V5KSA9PiB7XHJcbiAgICAgIHJldHVybiBjdXJyZW50LnJlcGxhY2UoJyUnICsga2V5LCByZXBsYWNlbWVudHNba2V5XSk7XHJcbiAgICB9LCB0ZXh0KTtcclxuICB9XHJcblxyXG4gIGdldE5leHRNaW51ZXRzKGRhdGU6IG1vbWVudC5Nb21lbnQgPSBtb21lbnQoKSwgbWludXRlc1RvUm91bmQgPSAxNSkge1xyXG4gICAgZGF0ZS5taW51dGUoTWF0aC5jZWlsKGRhdGUubWludXRlKCkgLyBtaW51dGVzVG9Sb3VuZCkgKiBtaW51dGVzVG9Sb3VuZCk7XHJcbiAgICByZXR1cm4gZGF0ZS5mb3JtYXQoJ0hIOm1tJyk7XHJcbiAgfVxyXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAqIEJlbG93IGFyZSBmdW5jdGlvbnMgbmVlZGVkIGZvciBnZW5lcmF0aW5nIHRoZSBoYXNoZWQgbnVtYmVyIG9uY2UgdG9rZW4sIHRha2VuIGFzIHJlcXVpcmVkXHQqXHJcbiAgICogRG9uJ3QgTWVzcyB3aXRoIHRoZXNlXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KlxyXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICBnZXROdW1iZXJPbmNlVmFsdWUodG9rZW46IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByYW5kb21fdmFsdWUgPSB0aGlzLmd1aWQoKTtcclxuICAgIHJldHVybiByYW5kb21fdmFsdWUgKyAnXycgKyBoZXhfaG1hY19tZDUodG9rZW4sIHJhbmRvbV92YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBndWlkKCk6IGFueSB7XHJcbiAgICBsZXQgcmFuZG9tX2hleCA9ICcnO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzI7IGkrKykge1xyXG4gICAgICByYW5kb21faGV4ICs9IHRoaXMuczQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmFuZG9tX2hleDtcclxuICB9XHJcblxyXG4gIHM0KCk6IGFueSB7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMClcclxuICAgICAgLnRvU3RyaW5nKDE2KVxyXG4gICAgICAuc3Vic3RyaW5nKDEpO1xyXG4gIH1cclxuXHJcbiAgY2FwaXRhbGlzZUZpcnN0TGV0dGVyKHdvcmQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAod29yZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmcm9tT2JqZWN0KC4uLmFyZ3M6IGFueVtdKTogYW55IHtcclxuICAgIGxldCBkYXRhID0gYXJncy5zaGlmdCgpO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBkYXRhICYmIGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcclxuICAgICAgZGF0YSA9IGRhdGFbYXJnc1tpbmRleF1dO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBtb21lbnRSb3VuZE1pbnV0ZXModGltZTogbW9tZW50Lk1vbWVudCwgcm91bmQ6IG51bWJlcik6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgdGltZSA9IG1vbWVudCh0aW1lKS5zdGFydE9mKCdtaW51dGVzJyk7XHJcbiAgICBsZXQgZGlmZiA9IHRpbWUubWludXRlcygpICUgcm91bmQ7XHJcbiAgICBpZiAoZGlmZiAhPT0gMCkge1xyXG4gICAgICBkaWZmID0gcm91bmQgLSBkaWZmO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRpbWUuYWRkKGRpZmYsICdtaW51dGUnKTtcclxuICB9XHJcblxyXG4gIHJvdW5kKGRhdGU6IGFueSwgZHVyYXRpb246IGFueSkge1xyXG4gICAgcmV0dXJuIG1vbWVudChNYXRoLmNlaWwoK2RhdGUgLyArZHVyYXRpb24pICogK2R1cmF0aW9uKTtcclxuICB9XHJcblxyXG4gIGljc0ZvbGQoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxpbmVzID0gYm9keS5zcGxpdCgvXFxyXFxuL2cpO1xyXG4gICAgcmV0dXJuIGxpbmVzXHJcbiAgICAgIC5tYXAoKGxpbmUpID0+IHtcclxuICAgICAgICBsZXQgcmVzID0gJyc7XHJcbiAgICAgICAgY29uc3QgbiA9IDcyO1xyXG4gICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTtcclxuICAgICAgICB3aGlsZSAobGluZS5sZW5ndGggPiBuKSB7XHJcbiAgICAgICAgICByZXMgKz0gYCR7bGluZS5zbGljZSgwLCBuKX1cXHJcXG5gO1xyXG4gICAgICAgICAgbGluZSA9IGAgJHtsaW5lLnNsaWNlKG4pLnRyaW0oKX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGluZS50cmltKCkpIHtcclxuICAgICAgICAgIHJlcyArPSBsaW5lO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9KVxyXG4gICAgICAuam9pbignXFxyXFxuJyk7XHJcbiAgfVxyXG5cclxuICBzcGxpdEFkZHJlc3NMaW5lKFxyXG4gICAgbGluZTogc3RyaW5nLFxyXG4gICAgbGVuOiBudW1iZXJcclxuICApOiB7IGxpbmU6IHN0cmluZzsgcmVzaWR1ZTogc3RyaW5nIH0ge1xyXG4gICAgY29uc3QgcmVzID0ge1xyXG4gICAgICBsaW5lOiBsaW5lLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCksXHJcbiAgICAgIHJlc2lkdWU6ICcnXHJcbiAgICB9O1xyXG4gICAgaWYgKHJlcy5saW5lLmxlbmd0aCA+IGxlbikge1xyXG4gICAgICBsZXQgaSA9IHJlcy5saW5lLnNsaWNlKDAsIGxlbikubGFzdEluZGV4T2YoJywnKTtcclxuICAgICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgICAgcmVzLnJlc2lkdWUgPSByZXMubGluZS5zbGljZShpICsgMSkudHJpbSgpO1xyXG4gICAgICAgIHJlcy5saW5lID0gcmVzLmxpbmUuc2xpY2UoMCwgaSkudHJpbSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGkgPSByZXMubGluZS5zbGljZSgwLCBsZW4pLmxhc3RJbmRleE9mKCcgJyk7XHJcbiAgICAgICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgICAgICByZXMucmVzaWR1ZSA9IHJlcy5saW5lLnNsaWNlKGkgKyAxKS50cmltKCk7XHJcbiAgICAgICAgICByZXMubGluZSA9IHJlcy5saW5lLnNsaWNlKDAsIGkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXMucmVzaWR1ZSA9IHJlcy5saW5lLnNsaWNlKGxlbik7XHJcbiAgICAgICAgICByZXMubGluZSA9IHJlcy5saW5lLnNsaWNlKDAsIGxlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgZGF5c0JldHdlZW4oc3RhcnQ6IG1vbWVudC5Nb21lbnQsIGVuZDogbW9tZW50Lk1vbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZW5kLmRpZmYoc3RhcnQsICdkYXlzJyk7XHJcbiAgfVxyXG5cclxuICBtYXBQcm9taXNlPFQgPSBhbnksIFIgPSBhbnk+KFxyXG4gICAgYTogVFtdLFxyXG4gICAgZjogKHZhbDogVCwgaW5kZXg6IG51bWJlcikgPT4gUiB8IFByb21pc2U8Uj4sXHJcbiAgICBtYXg/OiBudW1iZXJcclxuICApOiBQcm9taXNlPFJbXT4ge1xyXG4gICAgY29uc3QgaXQgPSBhW1N5bWJvbC5pdGVyYXRvcl0oKTtcclxuICAgIGNvbnN0IHJlc3VsdDogUltdID0gW107XHJcbiAgICBjb25zdCBidWZmZXI6IFByb21pc2U8Uj5bXSA9IFtdO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgbmV4dGYgPSAoKTogUHJvbWlzZTxSPiA9PiB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSBpdC5uZXh0KCk7XHJcbiAgICAgIGlmIChuZXh0LmRvbmUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW5kZXggPSBpKys7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZihuZXh0LnZhbHVlLCBpbmRleCkpLnRoZW4oKHZhbCkgPT4ge1xyXG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSB2YWw7XHJcbiAgICAgICAgcmV0dXJuIG5leHRmKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHdoaWxlICghbWF4IHx8IGJ1ZmZlci5sZW5ndGggPD0gbWF4KSB7XHJcbiAgICAgIGNvbnN0IG4gPSBuZXh0ZigpO1xyXG4gICAgICBpZiAobikge1xyXG4gICAgICAgIGJ1ZmZlci5wdXNoKG4pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoYnVmZmVyKS50aGVuKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFwU2VyaWVzUHJvbWlzZTxUID0gYW55LCBSID0gYW55PihcclxuICAgIGE6IFRbXSxcclxuICAgIGY6ICh2YWw6IFQsIGluZGV4OiBudW1iZXIpID0+IFIgfCBQcm9taXNlPFI+XHJcbiAgKTogUHJvbWlzZTxSW10+IHtcclxuICAgIHJldHVybiB0aGlzLm1hcFByb21pc2UoYSwgZiwgMSk7XHJcbiAgfVxyXG5cclxuICBvYmoycXVlcnlTdHJpbmcob2JqOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIF8ucmVkdWNlKFxyXG4gICAgICBvYmosXHJcbiAgICAgIChhLCB2LCBrKSA9PiB7XHJcbiAgICAgICAgaWYgKGEgIT09ICcnKSB7XHJcbiAgICAgICAgICBhICs9ICcmJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke2F9JHtlbmNvZGVVUklDb21wb25lbnQoayl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHYpfWA7XHJcbiAgICAgIH0sXHJcbiAgICAgICcnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc3RyaXBQdW5jdHVhdGlvbihzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHMucmVwbGFjZSgvW15hLXpBLVowLTlcXHNdL2csICcnKTtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VBbGwoaGF5c3RhY2s6IHN0cmluZywgbmVlZGxlOiBzdHJpbmcsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGhheXN0YWNrXHJcbiAgICAgID8gaGF5c3RhY2sucmVwbGFjZShuZXcgUmVnRXhwKG5lZWRsZSwgJ2cnKSwgcmVwbGFjZW1lbnQpXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGRhdGVUaW1lKHNhYnNEYXRlOiBzdHJpbmcsIHNhYnNUaW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgY29uc3QgdGVtcERhdGUgPSBzYWJzRGF0ZS5tYXRjaCgvLnsxLDJ9L2cpOyAvLyBzcGxpdHMgZXZlcnkgMiBjaGFyYWN0ZXJzXHJcbiAgICBjb25zdCB0ZW1wVGltZSA9IHNhYnNUaW1lLm1hdGNoKC8uezEsMn0vZyk7XHJcblxyXG4gICAgY29uc3QgbmV3U3RyID1cclxuICAgICAgJzIwJyArXHJcbiAgICAgIHRlbXBEYXRlWzBdICtcclxuICAgICAgJy0nICtcclxuICAgICAgdGVtcERhdGVbMV0gK1xyXG4gICAgICAnLScgK1xyXG4gICAgICB0ZW1wRGF0ZVsyXSArXHJcbiAgICAgICdUJyArXHJcbiAgICAgIHRlbXBUaW1lWzBdICtcclxuICAgICAgJzonICtcclxuICAgICAgdGVtcFRpbWVbMV0gK1xyXG4gICAgICAnOjAwJztcclxuICAgIHJldHVybiBuZXdTdHI7XHJcbiAgfVxyXG5cclxuICBhbHRlcm5hdGVKU09OU3RyaW5naWZ5KGpzb25PYmplY3Q6IGFueSk6IHN0cmluZyB7XHJcbiAgICBsZXQganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmplY3QpO1xyXG4gICAganNvblN0cmluZyA9IGpzb25TdHJpbmcucmVwbGFjZSgvXCIvZywgJ2AnKTtcclxuICAgIHJldHVybiBqc29uU3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29udmVydCBvYmplY3QgdG8gYXJyYXlcclxuICBDb252ZXJ0T2JqZWN0VG9BcnJheShvYmplY3Q6IG9iamVjdCk6IGFueVtdIHtcclxuICAgIGxldCBhcnJheSA9IF8udmFsdWVzKG9iamVjdCk7XHJcbiAgICBhcnJheSA9IF8uZmxhdHRlbihhcnJheSk7XHJcbiAgICByZXR1cm4gYXJyYXk7XHJcbiAgfVxyXG5cclxuICBhZGREYXkoZGF0ZVN0cnVjdDogTmdiRGF0ZVN0cnVjdCk6IGFueSB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoXHJcbiAgICAgIGRhdGVTdHJ1Y3QueWVhcixcclxuICAgICAgZGF0ZVN0cnVjdC5tb250aCAtIDEsXHJcbiAgICAgIGRhdGVTdHJ1Y3QuZGF5ICsgMVxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJldERhdGUgPSB7XHJcbiAgICAgIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgbW9udGg6IGRhdGUuZ2V0TW9udGgoKSArIDEsXHJcbiAgICAgIGRheTogZGF0ZS5nZXREYXRlKClcclxuICAgIH07XHJcbiAgICAvLy8vIGNvbnNvbGUubG9nKHJldERhdGUpO1xyXG4gICAgLy8vLyBjb25zb2xlLmxvZyhkYXRlKTtcclxuICAgIHJldHVybiByZXREYXRlO1xyXG4gIH1cclxuXHJcbiAgaGFzaENvZGUodG9Db2RlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGhhc2ggPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9Db2RlLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgIGNvbnN0IGNoYXIgPSB0b0NvZGUuY2hhckNvZGVBdChpKTtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaGFyO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcclxuICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGhhc2gudG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIE1NZGR5eVRvTmdiKGRhdGU6IHN0cmluZyk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMubW9tZW50VG9OZ0RhdGUobW9tZW50KGRhdGUsIEJhc2VIZWxwZXJSb3V0aW5lcy5NTUREWVlfREFURSkpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRDaGlsZHJlblRyYXZlbGxlcnMoXHJcbiAgICBzZWxlY3RlZFRyYXZlbGxlcnM6IFRyYXZlbGxlcltdLFxyXG4gICAgdHlwZTogU2VydmljZVR5cGVcclxuICApIHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAvLyBUaGVzZSB0eXBlcyBkbyBub3QgaGF2ZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiBhZHVsdHMgYW5kIGNoaWxkcmVuLiBzbyBhbHdheXMgbWFyayBhcyBhZHVsdHMuXHJcbiAgICAgIGNhc2UgU2VydmljZVR5cGUuSG90ZWw6XHJcbiAgICAgIGNhc2UgU2VydmljZVR5cGUuQ2FiOlxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3RlZFRyYXZlbGxlcnMuZmlsdGVyKFxyXG4gICAgICAodHJhdmVsbGVyOiBUcmF2ZWxsZXIpID0+IHRyYXZlbGxlci5pc0NoaWxkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRUcmF2ZWxsZXJzKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdLCB0eXBlOiBTZXJ2aWNlVHlwZSkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIC8vIFRoZXNlIHR5cGVzIGRvIG5vdCBoYXZlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGFkdWx0cyBhbmQgY2hpbGRyZW4uIHNvIGFsd2F5cyBtYXJrIGFzIGFkdWx0cy5cclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5Ib3RlbDpcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5DYWI6XHJcbiAgICAgICAgcmV0dXJuIHsgYWR1bHRzOiB0cmF2ZWxsZXJzLCBjaGlsZHJlbjogW10sIGluZmFudHM6IFtdIH07XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHRyYXZlbGxlcnMucmVkdWNlKFxyXG4gICAgICAgICAgKFxyXG4gICAgICAgICAgICBhY2N1bToge1xyXG4gICAgICAgICAgICAgIGFkdWx0czogVHJhdmVsbGVyW107XHJcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFRyYXZlbGxlcltdO1xyXG4gICAgICAgICAgICAgIGluZmFudHM6IFRyYXZlbGxlcltdO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXI6IFRyYXZlbGxlclxyXG4gICAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0cmF2ZWxsZXIuaXNDaGlsZCkge1xyXG4gICAgICAgICAgICAgIGlmICh0cmF2ZWxsZXIuaXNJbmZhbnQpIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtLmluZmFudHMucHVzaCh0cmF2ZWxsZXIpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhY2N1bS5jaGlsZHJlbi5wdXNoKHRyYXZlbGxlcik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGFjY3VtLmFkdWx0cy5wdXNoKHRyYXZlbGxlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYWR1bHRzOiBbXSxcclxuICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxyXG4gICAgICAgICAgICBpbmZhbnRzOiBbXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlbGVjdGVkQWR1bHRUcmF2ZWxsZXJzKHNlbGVjdGVkVHJhdmVsbGVyczogVHJhdmVsbGVyW10sIHR5cGU6IFNlcnZpY2VUeXBlKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgLy8gVGhlc2UgdHlwZXMgZG8gbm90IGhhdmUgYSBkaWZmZXJlbmNlIGJldHdlZW4gYWR1bHRzIGFuZCBjaGlsZHJlbi4gc28gYWx3YXlzIG1hcmsgYXMgYWR1bHRzLlxyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkhvdGVsOlxyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkNhYjpcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRUcmF2ZWxsZXJzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGVkVHJhdmVsbGVycy5maWx0ZXIoXHJcbiAgICAgICh0cmF2ZWxsZXI6IFRyYXZlbGxlcikgPT4gIXRyYXZlbGxlci5pc0NoaWxkICYmICF0cmF2ZWxsZXIuaXNJbmZhbnRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0NoaWxkKHRyYXZlbGxlcjogVHJhdmVsbGVyIHwgRGF0ZSwgbWF4QWdlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0cmF2ZWxsZXIgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIGNvbnN0IGFkdWx0RGF0ZSA9IG1vbWVudCgpLmFkZCgtbWF4QWdlLCAneWVhcnMnKTtcclxuICAgICAgcmV0dXJuIGFkdWx0RGF0ZS5pc0JlZm9yZShcclxuICAgICAgICBtb21lbnQodHJhdmVsbGVyLCBCYXNlSGVscGVyUm91dGluZXMuSVNPX0RBVEFfRk9STUFUKSxcclxuICAgICAgICAnZGF5J1xyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRyYXZlbGxlci5pc0NoaWxkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNDaGlsZEZsaWdodCh0cmF2ZWxsZXI6IFRyYXZlbGxlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQ2hpbGQodHJhdmVsbGVyLCBGTElHSFRfTUFYX0NISUxEX0FHRV9ZRUFSUyk7XHJcbiAgfVxyXG5cclxuICBpc0NoaWxkUmFpbCh0cmF2ZWxsZXI6IFRyYXZlbGxlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQ2hpbGQodHJhdmVsbGVyLCBSQUlMX01BWF9DSElMRF9BR0VfWUVBUlMpO1xyXG4gIH1cclxuXHJcbiAgaXNDaGlsZEV1cm9zdGFyKHRyYXZlbGxlcjogVHJhdmVsbGVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNDaGlsZCh0cmF2ZWxsZXIsIEVVUk9TVEFSX01BWF9DSElMRF9BR0VfWUVBUlMpO1xyXG4gIH1cclxuXHJcbiAgdW5pcUJ5KGFycmF5OiBhbnlbXSwgdmFsdWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIF8udW5pcUJ5KGFycmF5LCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBpc0NoaWxkKHRyYXZlbGxlcjogVHJhdmVsbGVyIHwgRGF0ZSwgdHJhdmVsVHlwZTogU2VydmljZVR5cGUpIHtcclxuICAgIHN3aXRjaCAodHJhdmVsVHlwZSkge1xyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkZsaWdodDpcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNDaGlsZCh0cmF2ZWxsZXIsIEZMSUdIVF9NQVhfQ0hJTERfQUdFX1lFQVJTKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5SYWlsOlxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NoaWxkKHRyYXZlbGxlciwgUkFJTF9NQVhfQ0hJTERfQUdFX1lFQVJTKTtcclxuICAgICAgLy8gY2FzZSBTZXJ2aWNlVHlwZS5FdXJvc3RhcjpcclxuICAgICAgLy8gIHJldHVybiB0aGlzLl9pc0NoaWxkKHRyYXZlbGxlciwgRVVST1NUQVJfTUFYX0NISUxEX0FHRV9ZRUFSUyk7XHJcbiAgICAgIGNhc2UgU2VydmljZVR5cGUuQ29hY2g6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ2hpbGQodHJhdmVsbGVyLCBDT0FDSF9NQVhfQ0hJTERfQUdFX1lFQVJTKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5Mb3VuZ2U6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ2hpbGQodHJhdmVsbGVyLCBMT1VOR0VTX01BWF9DSElMRF9BR0VfWUVBUlMpO1xyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkhvdGVsOlxyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkNhYjpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNJbmZhbnQodHJhdmVsbGVyOiBUcmF2ZWxsZXIgfCBEYXRlLCB0cmF2ZWxUeXBlOiBTZXJ2aWNlVHlwZSkge1xyXG4gICAgc3dpdGNoICh0cmF2ZWxUeXBlKSB7XHJcbiAgICAgIGNhc2UgU2VydmljZVR5cGUuRmxpZ2h0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NoaWxkKHRyYXZlbGxlciwgRkxJR0hUX01BWF9JTkZBTlRfQUdFX1lFQVJTKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5SYWlsOlxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NoaWxkKHRyYXZlbGxlciwgUkFJTF9NQVhfSU5GQU5UX0FHRV9ZRUFSUyk7XHJcbiAgICAgIC8vIGNhc2UgU2VydmljZVR5cGUuRXVyb3N0YXI6XHJcbiAgICAgIC8vICByZXR1cm4gdGhpcy5faXNDaGlsZCh0cmF2ZWxsZXIsIEVVUk9TVEFSX01BWF9DSElMRF9BR0VfWUVBUlMpO1xyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkNvYWNoOlxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NoaWxkKHRyYXZlbGxlciwgQ09BQ0hfTUFYX0lORkFOVF9BR0VfWUVBUlMpO1xyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkxvdW5nZTpcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNDaGlsZCh0cmF2ZWxsZXIsIExPVU5HRVNfTUFYX0lORkFOVF9BR0VfWUVBUlMpO1xyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkhvdGVsOlxyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkNhYjpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QWdlVHlwZSh0cmF2ZWxsZXI6IFRyYXZlbGxlciwgdHJhdmVsVHlwZTogU2VydmljZVR5cGUpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNDaGlsZCh0cmF2ZWxsZXIsIHRyYXZlbFR5cGUpID8gJ0MnIDogJ0EnO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4Q2hpbGRBZ2UodHlwZTogU2VydmljZVR5cGUpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgU2VydmljZVR5cGUuRmxpZ2h0OlxyXG4gICAgICAgIHJldHVybiBtb21lbnQoKVxyXG4gICAgICAgICAgLmFkZCgtRkxJR0hUX01BWF9DSElMRF9BR0VfWUVBUlMgKyAxLCAneWVhcnMnKVxyXG4gICAgICAgICAgLmZvcm1hdChCYXNlSGVscGVyUm91dGluZXMuTU1ERFlZX0RBVEUpO1xyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLlJhaWw6XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudCgpXHJcbiAgICAgICAgICAuYWRkKC1SQUlMX01BWF9DSElMRF9BR0VfWUVBUlMgKyAxLCAneWVhcnMnKVxyXG4gICAgICAgICAgLmZvcm1hdChCYXNlSGVscGVyUm91dGluZXMuTU1ERFlZX0RBVEUpO1xyXG4gICAgICAvLyBjYXNlIFNlcnZpY2VUeXBlLkVVUk9TVEFSOlxyXG4gICAgICAvLyAgcmV0dXJuIG1vbWVudCgpLmFkZCgtRVVST1NUQVJfTUFYX0NISUxEX0FHRV9ZRUFSUyArIDEsICd5ZWFycycpLmZvcm1hdChIZWxwZXJzLk1NRERZWV9EQVRFKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5Db2FjaDpcclxuICAgICAgICByZXR1cm4gbW9tZW50KClcclxuICAgICAgICAgIC5hZGQoLUNPQUNIX01BWF9DSElMRF9BR0VfWUVBUlMgKyAxLCAneWVhcnMnKVxyXG4gICAgICAgICAgLmZvcm1hdChCYXNlSGVscGVyUm91dGluZXMuTU1ERFlZX0RBVEUpO1xyXG4gICAgICBjYXNlIFNlcnZpY2VUeXBlLkxvdW5nZTpcclxuICAgICAgICByZXR1cm4gbW9tZW50KClcclxuICAgICAgICAgIC5hZGQoLUxPVU5HRVNfTUFYX0NISUxEX0FHRV9ZRUFSUyArIDEsICd5ZWFycycpXHJcbiAgICAgICAgICAuZm9ybWF0KEJhc2VIZWxwZXJSb3V0aW5lcy5NTUREWVlfREFURSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0QWR1bHRBZ2UodHlwZTogU2VydmljZVR5cGUpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgU2VydmljZVR5cGUuRmxpZ2h0OlxyXG4gICAgICAgIHJldHVybiBtb21lbnQoKVxyXG4gICAgICAgICAgLmFkZCgtRkxJR0hUX01BWF9DSElMRF9BR0VfWUVBUlMgLSAxMCwgJ3llYXJzJylcclxuICAgICAgICAgIC5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLk1NRERZWV9EQVRFKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5SYWlsOlxyXG4gICAgICAgIHJldHVybiBtb21lbnQoKVxyXG4gICAgICAgICAgLmFkZCgtUkFJTF9NQVhfQ0hJTERfQUdFX1lFQVJTIC0gMTAsICd5ZWFycycpXHJcbiAgICAgICAgICAuZm9ybWF0KEJhc2VIZWxwZXJSb3V0aW5lcy5NTUREWVlfREFURSk7XHJcbiAgICAgIC8vIGNhc2UgU2VydmljZVR5cGUuRXVyb3N0YXI6XHJcbiAgICAgIC8vICByZXR1cm4gbW9tZW50KCkuYWRkKC1FVVJPU1RBUl9NQVhfQ0hJTERfQUdFX1lFQVJTIC0gMTAsICd5ZWFycycpLmZvcm1hdChIZWxwZXJzLk1NRERZWV9EQVRFKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5Db2FjaDpcclxuICAgICAgICByZXR1cm4gbW9tZW50KClcclxuICAgICAgICAgIC5hZGQoLUNPQUNIX01BWF9DSElMRF9BR0VfWUVBUlMgLSAxMCwgJ3llYXJzJylcclxuICAgICAgICAgIC5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLk1NRERZWV9EQVRFKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5Mb3VuZ2U6XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudCgpXHJcbiAgICAgICAgICAuYWRkKC1MT1VOR0VTX01BWF9DSElMRF9BR0VfWUVBUlMgLSAxMCwgJ3llYXJzJylcclxuICAgICAgICAgIC5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLk1NRERZWV9EQVRFKTtcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5Ib3RlbDpcclxuICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5DYWI6XHJcbiAgICAgICAgLy8gVGhlc2UgdHlwZXMgZG8gbm90IGhhdmUgY2hpbGQgcGxhY2VzIHNvXHJcbiAgICAgICAgcmV0dXJuIG1vbWVudCgpXHJcbiAgICAgICAgICAuYWRkKC0xOCwgJ3llYXJzJylcclxuICAgICAgICAgIC5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLk1NRERZWV9EQVRFKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtb21lbnQoKS5hZGQoLTE4LCAneWVhcnMnKS5mb3JtYXQoQmFzZUhlbHBlclJvdXRpbmVzLk1NRERZWV9EQVRFKTtcclxuICB9XHJcblxyXG4gIHRyYW5zZm9ybShcclxuICAgIGFycmF5OiBhbnlbXSxcclxuICAgIGNhbGxiYWNrOiBfLk1lbW9Wb2lkQXJyYXlJdGVyYXRvcjxhbnksIGFueVtdPixcclxuICAgIGFjYzogYW55XHJcbiAgKTogYW55W10ge1xyXG4gICAgcmV0dXJuIF8udHJhbnNmb3JtKGFycmF5LCBjYWxsYmFjaywgYWNjKTtcclxuICB9XHJcblxyXG4gIGFycmF5VG9PYmplY3Q8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogYW55IH0+KFxyXG4gICAgYXJyYXk6IFRbXSxcclxuICAgIGZpZWxkOiBzdHJpbmdcclxuICApOiB7IFtrZXk6IHN0cmluZ106IFQgfSB7XHJcbiAgICByZXR1cm4gYXJyYXlcclxuICAgICAgLmZpbHRlcigoZGF0YTogVCkgPT4gISFkYXRhKVxyXG4gICAgICAucmVkdWNlKChjb25maWdzOiB7IFtrZXk6IHN0cmluZ106IFQgfSwgY29uZmlnSXRlbTogVCkgPT4ge1xyXG4gICAgICAgIGlmIChjb25maWdJdGVtICYmIGNvbmZpZ0l0ZW1bZmllbGRdKSB7XHJcbiAgICAgICAgICBjb25maWdzW2NvbmZpZ0l0ZW1bZmllbGRdXSA9IGNvbmZpZ0l0ZW07XHJcbiAgICAgICAgICByZXR1cm4gY29uZmlncztcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHt9KTtcclxuICB9XHJcblxyXG4gIGFycmF5VG9PYmplY3RBcnJheTxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oXHJcbiAgICBhcnJheTogVFtdLFxyXG4gICAgZmllbGQ6IHN0cmluZ1xyXG4gICk6IHsgW2tleTogc3RyaW5nXTogVFtdIH0ge1xyXG4gICAgcmV0dXJuIGFycmF5XHJcbiAgICAgIC5maWx0ZXIoKGRhdGE6IFQpID0+ICEhZGF0YSlcclxuICAgICAgLnJlZHVjZSgoY29uZmlnczogeyBba2V5OiBzdHJpbmddOiBUW10gfSwgY29uZmlnSXRlbTogVCkgPT4ge1xyXG4gICAgICAgIGlmIChjb25maWdJdGVtICYmIGNvbmZpZ0l0ZW1bZmllbGRdKSB7XHJcbiAgICAgICAgICBjb25maWdzW2NvbmZpZ0l0ZW1bZmllbGRdXSA9IGNvbmZpZ3NbY29uZmlnSXRlbVtmaWVsZF1dIHx8IFtdO1xyXG4gICAgICAgICAgY29uZmlnc1tjb25maWdJdGVtW2ZpZWxkXV0ucHVzaChjb25maWdJdGVtKTtcclxuICAgICAgICAgIHJldHVybiBjb25maWdzO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwge30pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybWluYWxzKGFpcnBvcnQ6IEFpcnBvcnQpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gYWlycG9ydC50ZXJtaW5hbHM7XHJcbiAgfVxyXG5cclxuICBmaWVsZEZyb21PYmplY3Qob2JqOiBvYmplY3QsIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChmaWVsZCB8fCAnJylcclxuICAgICAgLnNwbGl0KCcuJylcclxuICAgICAgLnJlZHVjZSgoY3VycmVudDogUmVjb3JkPHN0cmluZywgYW55PiwgZmllbGQxOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50W2ZpZWxkMV0pIHtcclxuICAgICAgICAgIHJldHVybiBjdXJyZW50W2ZpZWxkMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfSwgb2JqKTtcclxuICB9XHJcblxyXG4gIG1hcEZpZWxkRnJvbU9iamVjdDxLIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBUPihmaWVsZDogSykge1xyXG4gICAgcmV0dXJuIChvYmo6IFJlY29yZDxLLCBhbnk+KTogVCA9PiB7XHJcbiAgICAgIHJldHVybiBvYmpbZmllbGRdO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU51bGxzPFQ+KHF1ZXJ5OiBUKTogVCB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocXVlcnkpLnJlZHVjZSgoYWNjdW06IFQsIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gKHF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV07XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxyXG4gICAgICAgID8gdmFsdWUuZmlsdGVyKChpdGVtOiBhbnkpID0+ICEhaXRlbSkgfHwgbnVsbFxyXG4gICAgICAgIDogdmFsdWU7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gJ251bGwnKSB8fFxyXG4gICAgICAgIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMClcclxuICAgICAgKSB7XHJcbiAgICAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPSBkYXRhO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhY2N1bTtcclxuICAgIH0sIHt9IGFzIFQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VHJhdmVsbGVyc0lkKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKTogc3RyaW5nW10ge1xyXG4gICAgaWYgKHRyYXZlbGxlcnMpIHtcclxuICAgICAgcmV0dXJuIHRyYXZlbGxlcnMucmVkdWNlKFxyXG4gICAgICAgIChwcmV2aW91c1ZhbHVlOiBzdHJpbmdbXSwgY3VycmVudFZhbHVlOiBUcmF2ZWxsZXIsIGlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGlkeCA9PT0gMCA/IFtjdXJyZW50VmFsdWUuaWRdIDogWy4uLnByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZS5pZF07XHJcbiAgICAgIH0sIFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGxvb3Agb3ZlciB0aGUgcXVlcnkgb2JqZWN0IHBhcmFtIGFuZCBjb252ZXJ0IGFueSBtb21lbnQgZGF0ZSBvYmplY3RzIHRvIGRhdGUtdGltZSBzdHJpbmdzXHJcbiAgICogQHBhcmFtIHF1ZXJ5XHJcbiAgICogQHBhcmFtIGRlYnVnXHJcbiAgICovXHJcbiAgc2FuaXRpemVNb21lbnREYXRlcyhxdWVyeTogYW55LCBkZWJ1ZyA9IGZhbHNlKTogYW55IHtcclxuICAgIGNvbnN0IHNhbml0aXplZFF1ZXJ5ID0geyAuLi5xdWVyeSB9O1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2FuaXRpemVkUXVlcnkpKSB7XHJcbiAgICAgIGlmIChtb21lbnQuaXNNb21lbnQodmFsdWUpKSB7XHJcbiAgICAgICAgc2FuaXRpemVkUXVlcnlba2V5XSA9IHNhbml0aXplZFF1ZXJ5W2tleV0udG9JU09TdHJpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCctLSBzYW5pdGl6ZU1vbWVudERhdGVzKCkgY2FsbGVkIC0tJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdvcmlnaW5hbCBxdWVyeTogJywgcXVlcnkpO1xyXG4gICAgICBjb25zb2xlLmxvZygnc2FuaXRpemVkIHF1ZXJ5OiAnLCBzYW5pdGl6ZWRRdWVyeSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2FuaXRpemVkUXVlcnk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZ3M8VD4odG9Gb3JtYXQ6IFQsIHNjaGVtYTogU2NoZW1hKTogVCB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc2NoZW1hLnByb3BlcnRpZXMgfHwge30pLnJlZHVjZShcclxuICAgICAgKGN1cnJlbnRWYWx1ZTogVCwgW2tleSwgdmFsdWVdOiBbc3RyaW5nLCBTY2hlbWFdKTogVCA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLl9mb3JtYXRWYWx1ZShcclxuICAgICAgICAgIHRvRm9ybWF0W2tleSBhcyBrZXlvZiBUXSxcclxuICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgKHNjaGVtYS5yZXF1aXJlZCB8fCBbXSkuaW5jbHVkZXMoa2V5KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlW2tleSBhcyBrZXlvZiBUXSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xyXG4gICAgICB9LFxyXG4gICAgICB7fSBhcyBUXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZm9ybWF0VmFsdWUodmFsdWU6IGFueSwgc2NoZW1hOiBTY2hlbWEsIGlzUmVxdWlyZWQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgc3dpdGNoIChzY2hlbWEudHlwZSkge1xyXG4gICAgICBjYXNlICdpbnRlZ2VyJzpcclxuICAgICAgICBjb25zdCB0bXAgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcclxuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHRtcCkgPyAoaXNSZXF1aXJlZCA/IDAgOiBudWxsKSA6IHRtcDtcclxuICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgICBjb25zdCB0bXAxID0gdmFsdWUgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gdG1wMSAmJiB0bXAxLmxlbmd0aCA+IDAgPyB0bXAxIDogaXNSZXF1aXJlZCA/ICcnIDogbnVsbDtcclxuICAgICAgY2FzZSAnb2JqZWN0JzpcclxuICAgICAgICByZXR1cm4gdmFsdWUgPyB0aGlzLnRvU3RyaW5ncyh2YWx1ZSwgc2NoZW1hKSA6IGlzUmVxdWlyZWQgPyB7fSA6IG51bGw7XHJcbiAgICAgIGNhc2UgJ2FycmF5JzpcclxuICAgICAgICByZXR1cm4gdmFsdWU7IC8vIFRPRE8gd3JpdGUgYXJyYXkgdHJhbnNsYXRpb25cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYWtlVGltZVdpbmRvdyhkYXRlVGltZTogbW9tZW50Lk1vbWVudCwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gZGF0ZVRpbWUuY2xvbmUoKS5hZGQoc3RhcnQsICdob3VyJyk7XHJcbiAgICBjb25zdCBlbmRUaW1lID0gZGF0ZVRpbWUuY2xvbmUoKS5hZGQoZW5kLCAnaG91cicpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmZvcm1hdFRpbWUoc3RhcnRUaW1lKSArICctJyArIHRoaXMuZm9ybWF0VGltZShlbmRUaW1lKTtcclxuICB9XHJcblxyXG4gIGluUmFuZ2UodG9jaGVjazogbnVtYmVyLCByYW5nZTogTWluTWF4KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdG9jaGVjayA+PSByYW5nZS5taW4gJiYgdG9jaGVjayA8PSByYW5nZS5tYXg7XHJcbiAgfVxyXG5cclxuICBtYWtlVXNlcnModHJhdmVsbGVyczogVHJhdmVsbGVyW10pOiBVc2VyUGFzc2VuZ2VyVHlwZUlucHV0W10ge1xyXG4gICAgcmV0dXJuIHRyYXZlbGxlcnMubWFwKCh0cmF2ZWxsZXI6IFRyYXZlbGxlcik6IFVzZXJQYXNzZW5nZXJUeXBlSW5wdXQgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkOiB0cmF2ZWxsZXIuaWQsXHJcbiAgICAgICAgcGFzc2VuZ2VyVHlwZTogdHJhdmVsbGVyLmlzQ2hpbGRcclxuICAgICAgICAgID8gUGFzc2VuZ2VyVHlwZS5DaGlsZFxyXG4gICAgICAgICAgOiB0cmF2ZWxsZXIuaXNJbmZhbnRcclxuICAgICAgICAgID8gUGFzc2VuZ2VyVHlwZS5JbmZhbnRcclxuICAgICAgICAgIDogUGFzc2VuZ2VyVHlwZS5BZHVsdFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlTW9tZW50RGF5VGltZShhZGREYXk/OiBudW1iZXIsIGhoPzogbnVtYmVyLCBtPzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBkdCA9IG1vbWVudCgpO1xyXG5cclxuICAgIGlmIChhZGREYXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBkdC5hZGQoYWRkRGF5LCAnZGF5Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZHQuc2V0KCdob3VycycsIGhoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGR0LnNldCgnbWludXRlcycsIG0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkdDtcclxuICB9XHJcblxyXG4gIHNhbmF0aXplUmV0dXJuczxUPihcclxuICAgIGRlZmF1bHRzOiBULFxyXG4gICAgc3VwcGxpZWREYXRhOiBQYXJ0aWFsPFQ+LFxyXG4gICAgbW9tZW50RmllbGRzPzogKGtleW9mIFQpW11cclxuICApOiBUIHtcclxuICAgIGNvbnN0IGNvbWJpbmVkOiBUID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIHN1cHBsaWVkRGF0YSk7XHJcbiAgICByZXR1cm4gKG1vbWVudEZpZWxkcyB8fCBbXSkucmVkdWNlKChjdXJyZW50OiBULCBuZXh0OiBrZXlvZiBUKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gKGN1cnJlbnQgYXMgYW55KVtuZXh0XTtcclxuICAgICAgKGN1cnJlbnQgYXMgYW55KVtuZXh0XSA9ICF2YWx1ZVxyXG4gICAgICAgID8gbW9tZW50KClcclxuICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcclxuICAgICAgICA/IG1vbWVudCh2YWx1ZSlcclxuICAgICAgICA6IHZhbHVlO1xyXG4gICAgICByZXR1cm4gY3VycmVudDtcclxuICAgIH0sIGNvbWJpbmVkKTtcclxuICB9XHJcblxyXG4gIG1pSXNWYWxpZCh0b0NoZWNrOiBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWRbXSkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdG9DaGVjay5sZW5ndGggPT09IDAgfHxcclxuICAgICAgISF0b0NoZWNrLmZpbmQoKG1pSXRlbTogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG1pSXRlbS5pc1ZhbGlkKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaXNNaVZhbGlkKFxyXG4gICAgbWlQZXJJdGVtOiBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWRbXSxcclxuICAgIG1pUGVyVXNlcjoge1xyXG4gICAgICBba2V5OiBzdHJpbmddOiB7XHJcbiAgICAgICAgbWFuYWdlbWVudEluZm86IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZFtdO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdXNlck1pcyA9IE9iamVjdC52YWx1ZXMobWlQZXJVc2VyIHx8IHt9KTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMubWlJc1ZhbGlkKG1pUGVySXRlbSkgJiZcclxuICAgICAgKHVzZXJNaXMubGVuZ3RoID09PSAwIHx8XHJcbiAgICAgICAgISF1c2VyTWlzLmZpbmQoXHJcbiAgICAgICAgICAodXNlck1pczE6IHsgbWFuYWdlbWVudEluZm86IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZFtdIH0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWlJc1ZhbGlkKHVzZXJNaXMxLm1hbmFnZW1lbnRJbmZvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5lZWRzTWkoYmFza2V0OiBCYXNrZXREZXRhaWxzLCBuZWVkc1RvVmlld01pOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBiYXNrZXQuYmFza2V0SW5mb01pRGV0YWlscy5sZW5ndGggPiAwICYmXHJcbiAgICAgIChuZWVkc1RvVmlld01pIHx8XHJcbiAgICAgICAgIWJhc2tldC5iYXNrZXRJbmZvTWlEZXRhaWxzLmZpbmQoXHJcbiAgICAgICAgICAobWlEZXRhaWw6IEJhc2tldEl0ZW1NYW5hZ2VtZW50SW5mbyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc01pVmFsaWQobWlEZXRhaWwubWlQZXJJdGVtLCBtaURldGFpbC5taVBlclVzZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFNlcnZpY2Uoc2VydmljZXM6IFVzZXJTZXJ2aWNlcywgaWQ6IHN0cmluZyk6IFNlcnZpY2Uge1xyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoc2VydmljZXMpLnJlZHVjZShcclxuICAgICAgKGN1cnJlbnQ6IFNlcnZpY2UsIHNlcnZpY2UxOiBTZXJ2aWNlW10pOiBTZXJ2aWNlID0+IHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgY3VycmVudCB8fFxyXG4gICAgICAgICAgc2VydmljZTEuZmluZCgoc2VydmljZTI6IFNlcnZpY2UpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UyLmlkID09PSBpZDtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSxcclxuICAgICAgbnVsbCBhcyBTZXJ2aWNlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWxsVHJ1ZShcclxuICAgIHN1cHBJbmZvOiBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbnRlcmZhY2VbXSxcclxuICAgIGZpbHRlcjogKHN1cHBJbmZvOiBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbnRlcmZhY2UpID0+IGJvb2xlYW5cclxuICApOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBwSW5mby5maWx0ZXIoZmlsdGVyKS5sZW5ndGggPT09IHN1cHBJbmZvLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGpvaW5Gcm9tQXR0cmlidXRlPFQ+KFxyXG4gICAgam9pbkNoYXJhY3Rlcjogc3RyaW5nLFxyXG4gICAgYXR0cmlidXRlOiBrZXlvZiBULFxyXG4gICAgYXJyYXk6IFRbXVxyXG4gICk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYXJyYXkubWFwKChpdGVtOiBUKSA9PiBpdGVtW2F0dHJpYnV0ZV0pLmpvaW4oam9pbkNoYXJhY3Rlcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBzcGxpdCB1cCBhbiBhcnJheSBpbnRvIGVxdWFsIHBhcnRzXHJcbiAgICogQHBhcmFtIGFycmF5IC0gdGhlIGFycmF5IHRvIHNwbGl0IHVwXHJcbiAgICogQHBhcmFtIHNpemUgLSB0aGUgc2l6ZSBvZiB0aGUgY29uc3RpdHVhbnQgcGFydHNcclxuICAgKiBAcGFyYW0gaW5jbHVkZVJlbWFpbmRlciAtIHdldGhlciBvciBub3QgdG8gaW5jbHVkZSBhbnkgcmVtYWluZyByZXN1bHRzIC0gZGVmYXVsdCB0cnVlXHJcbiAgICovXHJcbiAgc3BsaXRVcEFycmF5KFxyXG4gICAgYXJyYXk6IGFueVtdLFxyXG4gICAgc2l6ZTogbnVtYmVyLFxyXG4gICAgaW5jbHVkZVJlbWFpbmRlcjogYm9vbGVhbiA9IHRydWVcclxuICApOiBhbnlbXSB7XHJcbiAgICBjb25zdCBhcnJheUNvcHkgPSBfLmNsb25lRGVlcChhcnJheSk7IC8vIGxvZGFzaCBjbG9uZSBkZWVwXHJcbiAgICBsZXQgbmV3QXJyYXkgPSBbXTtcclxuXHJcbiAgICBpZiAoYXJyYXlDb3B5Lmxlbmd0aCA+IHNpemUpIHtcclxuICAgICAgd2hpbGUgKGFycmF5Q29weS5sZW5ndGggPj0gc2l6ZSkge1xyXG4gICAgICAgIG5ld0FycmF5LnB1c2goYXJyYXlDb3B5LnNwbGljZSgwLCBzaXplKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFkZCBhbnkgcmVtYWluaW5nXHJcbiAgICAgIGlmIChhcnJheUNvcHkubGVuZ3RoICYmIGluY2x1ZGVSZW1haW5kZXIpIHtcclxuICAgICAgICBuZXdBcnJheS5wdXNoKGFycmF5Q29weSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0FycmF5ID0gYXJyYXlDb3B5O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdBcnJheTtcclxuICB9XHJcblxyXG4gIEBNZW1vcmlzZSgpXHJcbiAgZ2V0VGltZURpZmZlcmVuY2UoZGVwRGF0ZVRpbWU6IHN0cmluZywgYXJyRGF0ZVRpbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbW9tZW50KGRlcERhdGVUaW1lKS5kaWZmKG1vbWVudChhcnJEYXRlVGltZSksICdtaW51dGVzJyk7XHJcbiAgfVxyXG5cclxuICBATWVtb3Jpc2UoKVxyXG4gIGRheURpZmZlcmVuY2UoZGVwdDogc3RyaW5nLCBhcnI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkaWZmID0gbW9tZW50KGFycilcclxuICAgICAgLnN0YXJ0T2YoJ2RheScpXHJcbiAgICAgIC5kaWZmKG1vbWVudChkZXB0KS5zdGFydE9mKCdkYXknKSwgJ2RheScpO1xyXG4gICAgcmV0dXJuIGRpZmYgPiAwID8gZGlmZi50b1N0cmluZygpIDogJyc7XHJcbiAgfVxyXG5cclxuICBATWVtb3Jpc2UoKVxyXG4gIG1ha2VGYXJlUnVsZXMoZmxpZ2h0OiBGbGlnaHRJdGluZXJhcnksIGRpcmVjdGlvbjogRmxpZ2h0RGlyZWN0aW9uRW51bSkge1xyXG4gICAgY29uc3QgZmxpZ2h0cyA9XHJcbiAgICAgIGRpcmVjdGlvbiA9PT0gRmxpZ2h0RGlyZWN0aW9uRW51bS5PdXRib3VuZFxyXG4gICAgICAgID8gZmxpZ2h0Lm91dGJvdW5kRmxpZ2h0c1xyXG4gICAgICAgIDogZmxpZ2h0LmluYm91bmRGbGlnaHRzO1xyXG4gICAgY29uc3QgcnVsZXMgPSBmbGlnaHRzLnJlZHVjZShcclxuICAgICAgKGN1cnJlbnQ6IEZhcmVDb25kaXRpb25zLCBuZXh0OiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgY3VycmVudC5jYW5jZWxsYXRpb24gPSBjdXJyZW50LmNhbmNlbGxhdGlvbi5jb25jYXQoXHJcbiAgICAgICAgICBuZXh0LmZhcmVDb25kaXRpb25zPy5jYW5jZWxsYXRpb24gfHwgW11cclxuICAgICAgICApO1xyXG4gICAgICAgIGN1cnJlbnQuY2hhbmdlID0gY3VycmVudC5jaGFuZ2UuY29uY2F0KFxyXG4gICAgICAgICAgbmV4dC5mYXJlQ29uZGl0aW9ucz8uY2hhbmdlIHx8IFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjdXJyZW50Lm5vU2hvdyA9IGN1cnJlbnQubm9TaG93LmNvbmNhdChcclxuICAgICAgICAgIG5leHQuZmFyZUNvbmRpdGlvbnM/Lm5vU2hvdyB8fCBbXVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY3VycmVudC51cGdyYWRlID0gY3VycmVudC51cGdyYWRlLmNvbmNhdChcclxuICAgICAgICAgIG5leHQuZmFyZUNvbmRpdGlvbnM/LnVwZ3JhZGUgfHwgW11cclxuICAgICAgICApO1xyXG4gICAgICAgIGN1cnJlbnQub3RoZXIgPSBjdXJyZW50Lm90aGVyLmNvbmNhdChuZXh0LmZhcmVDb25kaXRpb25zPy5vdGhlciB8fCBbXSk7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBjYW5jZWxsYXRpb246IFtdLFxyXG4gICAgICAgIGNoYW5nZTogW10sXHJcbiAgICAgICAgbm9TaG93OiBbXSxcclxuICAgICAgICB1cGdyYWRlOiBbXSxcclxuICAgICAgICBvdGhlcjogW11cclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiB7IHJ1bGVzLCBmbGlnaHRzIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyAtIGdlbmVyYXRlcyBpY3MgZmlsZSBjb250ZW50XHJcbiAgICovXHJcbiAgZ2VuZXJhdGVJY3NGaWxlQ29udGVudHMoYmFza2V0SXRlbXM6IEJhc2tldEl0ZW1bXSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBpY3NCb2R5Q29udGVudCA9IHRoaXMuZ2VuZXJhdGVJY3NGaWxlQm9keUNvbnRlbnQoYmFza2V0SXRlbXMpO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ0JFR0lOOlZDQUxFTkRBUlxcclxcbicsXHJcbiAgICAgICdQUk9ESUQ6LS8vTWljcm9zIFRyYXZlbC8vU0FCUyBDb3Jwb3JhdGUgLSBNTVhJSUkvL0VOXFxyXFxuJyxcclxuICAgICAgJ1ZFUlNJT046Mi4wXFxyXFxuJyxcclxuICAgICAgJ01FVEhPRDpSRVFVRVNUXFxyXFxuJyxcclxuICAgICAgaWNzQm9keUNvbnRlbnQsXHJcbiAgICAgICdFTkQ6VkNBTEVOREFSXFxyXFxuJ1xyXG4gICAgXS5qb2luKCcnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIC0gZ2VuZXJhdGVzIGljcyBmaWxlIGJvZHkgY29udGVudCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYmFza2V0SXRlbXMgcGFyYW1cclxuICAgKi9cclxuICBnZW5lcmF0ZUljc0ZpbGVCb2R5Q29udGVudChiYXNrZXRJdGVtczogQmFza2V0SXRlbVtdKTogc3RyaW5nIHtcclxuICAgIC8vIFRPRE86IGN1cnJlbnRseSBvbmx5IGJhc2tldCBpdGVtcyB3aXRoIFNlcnZpY2VUeXBlLkxvdW5nZSBhcmUgaGFuZGxlZC4gU2VlIGJlbG93IHRvIFRPRE9zIGZvciByZW1haW5pbmcgdGFza3NcclxuICAgIGNvbnN0IGJvZHlDb250ZW50OiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIC8vIGdlbmVyYXRlIGNhbGVuZGFyIGRhdGEgZm9yIGVhY2ggYmFza2V0IGl0ZW1cclxuICAgIGJhc2tldEl0ZW1zLm1hcCgoYmFza2V0SXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICBkU3RhcnQ6ICcnLFxyXG4gICAgICAgIGRFbmQ6ICcnLFxyXG4gICAgICAgIGxvY2F0aW9uRnJvbTogJycsXHJcbiAgICAgICAgbG9jYXRpb25UbzogJycsXHJcbiAgICAgICAgYmFza2V0SWQ6ICcnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcclxuICAgICAgICBzZXJ2aWNlVHlwZTogJycsXHJcbiAgICAgICAgc3VtbWFyeTogJydcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHsgdHlwZSB9ID0gYmFza2V0SXRlbS5zZXJ2aWNlO1xyXG5cclxuICAgICAgLy8gcG9wdWxhdGUgZGF0YSBvYmplY3QgZGVwZW5kaW5nIG9uIHRoZSBzZXJ2aWNlIHR5cGUgaW4gdGhlIGJhc2tldFxyXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlIFNlcnZpY2VUeXBlLkxvdW5nZTpcclxuICAgICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgYWR1bHRzLFxyXG4gICAgICAgICAgICBjaGlsZHJlbixcclxuICAgICAgICAgICAgYm9va2luZ1RoaXJkUGFydHlSZWZlcmVuY2UsXHJcbiAgICAgICAgICAgIGRldGFpbCxcclxuICAgICAgICAgICAgc2VydmljZVxyXG4gICAgICAgICAgfSA9IGJhc2tldEl0ZW07XHJcbiAgICAgICAgICBkYXRhLmJhc2tldElkID0gYmFza2V0SXRlbS5pZDtcclxuICAgICAgICAgIGRhdGEuZFN0YXJ0ID0gZGV0YWlsPy5hcnJpdmFsRGF0ZXRpbWU7XHJcbiAgICAgICAgICBkYXRhLmRFbmQgPSAnJztcclxuICAgICAgICAgIGRhdGEuc3VtbWFyeSA9IGBBaXJwb3J0IExvdW5nZSAtICR7ZGV0YWlsLm5hbWV9YDtcclxuICAgICAgICAgIGRhdGEuc2VydmljZVR5cGUgPSBzZXJ2aWNlLnR5cGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIGRhdGEuZGVzY3JpcHRpb24gPSBbXHJcbiAgICAgICAgICAgIGBMb3VuZ2U6ICR7ZGV0YWlsLm5hbWV9XFxyXFxuYCxcclxuICAgICAgICAgICAgYFN0YXJ0czogJHtkZXRhaWwuYXJyaXZhbERhdGV0aW1lfVxcclxcbmAsXHJcbiAgICAgICAgICAgIGBBZHVsdHM6ICR7YWR1bHRzfVxcclxcbmAsXHJcbiAgICAgICAgICAgIGBDaGlsZHJlbjogJHtjaGlsZHJlbn1cXHJcXG5gLFxyXG4gICAgICAgICAgICBgQm9va2luZyBSZWY6ICR7Ym9va2luZ1RoaXJkUGFydHlSZWZlcmVuY2V9YFxyXG4gICAgICAgICAgXS5qb2luKCcnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgU2VydmljZVR5cGUuQ2FiOlxyXG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGlzIGNhc2VcclxuICAgICAgICAvLyBoaW50OiBzZWUgbG9naWMgaW4gaWNhbGVuZGFyLmNvbXBvbmVudC50cyAgZmlsZSBvbiBsaWdodGluZyBjdXJyZW50IHZlcnNpb25cclxuICAgICAgICBjYXNlIFNlcnZpY2VUeXBlLkNhcjpcclxuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGhpcyBjYXNlXHJcbiAgICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5Db2FjaDpcclxuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGhpcyBjYXNlXHJcbiAgICAgICAgY2FzZSBTZXJ2aWNlVHlwZS5GYXN0VHJhY2s6XHJcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIHRoaXMgY2FzZVxyXG4gICAgICAgIGNhc2UgU2VydmljZVR5cGUuRmxpZ2h0OlxyXG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGlzIGNhc2VcclxuICAgICAgICBjYXNlIFNlcnZpY2VUeXBlLkhvdGVsOlxyXG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGlzIGNhc2VcclxuICAgICAgICBjYXNlIFNlcnZpY2VUeXBlLkludGVybmF0aW9uYWxSYWlsOlxyXG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGlzIGNhc2VcclxuICAgICAgICBjYXNlIFNlcnZpY2VUeXBlLlBhcmtpbmc6XHJcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIHRoaXMgY2FzZVxyXG4gICAgICAgIGNhc2UgU2VydmljZVR5cGUuUmFpbDpcclxuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGhpcyBjYXNlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGJvZHlDb250ZW50LnB1c2goXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgJ0JFR0lOOlZFVkVOVFxcclxcbicsXHJcbiAgICAgICAgICBkYXRhLmRTdGFydFxyXG4gICAgICAgICAgICA/IGBEVFNUQVJUOiR7bW9tZW50KGRhdGEuZFN0YXJ0KS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpfVxcclxcbmBcclxuICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgIGRhdGEuZEVuZFxyXG4gICAgICAgICAgICA/IGBEVEVORDoke21vbWVudChkYXRhLmRFbmQpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJyl9XFxyXFxuYFxyXG4gICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgJ09SR0FOSVpFUjtDTj1cIkRvIG5vdCByZXBseSB0byB0aGlzIGVtYWlsXCI6bWFpbHRvOmRvX25vdF9yZXBseUBzYWJzY29ycC5jb21cXHJcXG4nLFxyXG4gICAgICAgICAgZGF0YS5sb2NhdGlvblRvICYmIGRhdGEubG9jYXRpb25Gcm9tXHJcbiAgICAgICAgICAgID8gYExPQ0FUSU9OOiAke2RhdGEubG9jYXRpb25Ub30gdG8gJHtkYXRhLmxvY2F0aW9uRnJvbX0gXFxyXFxuYFxyXG4gICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgJ1RSQU5TUDpPUEFRVUVcXHJcXG4nLFxyXG4gICAgICAgICAgJ1NFUVVFTkNFOjBcXHJcXG4nLFxyXG4gICAgICAgICAgYFVJRDoke2RhdGEuc2VydmljZVR5cGV9XyR7aW5kZXh9XyR7ZGF0YS5iYXNrZXRJZH1Ac2Fic2NvcnAuY29tXFxyXFxuYCxcclxuICAgICAgICAgIGBEVFNUQU1QOiR7bW9tZW50KCkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKX1cXHJcXG5gLFxyXG4gICAgICAgICAgYERFU0NSSVBUSU9OOiR7ZGF0YS5kZXNjcmlwdGlvbn1cXHJcXG5gLFxyXG4gICAgICAgICAgYFNVTU1BUlk6JHtkYXRhLnN1bW1hcnl9XFxyXFxuYCxcclxuICAgICAgICAgICdFTkQ6VkVWRU5UXFxyXFxuJ1xyXG4gICAgICAgIF0uam9pbignJylcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBib2R5Q29udGVudC5qb2luKCcnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIC0gY3JlYXRlcyBhbiBlbGVtZW50IGluIG1lbW9yeSBhbmQgdHJpZ2dlcnMgY2xpY2sgZXZlbnQgdG8gZG93bmxvYWQgaWNzIGZpbGVcclxuICAgKi9cclxuICBkb3dubG9hZEljcyhmaWxlbmFtZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgJ2hyZWYnLFxyXG4gICAgICAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KVxyXG4gICAgKTtcclxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKTtcclxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7XHJcbiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICBlbGVtZW50LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBzcGxpdCBhIHN0cmluZyBvbiBjYXBpdGFsc1xyXG4gICAqIEBwYXJhbSByYXdTdHJpbmcgLSB0aGUgc3RyaW5nIHdlIHdhbnQgdG8gc3BsaXRcclxuICAgKiBAcGFyYW0gam9pbiAtIHdoZXRoZXIgb3Igbm90IHRvIGpvaW5nIHRoZSBzcGxpdCBpbnRvIG9uZSBzdHJpbmcsIHNlcGVyYXRlZCBieSBhIHNwYWNlXHJcbiAgICogQHJldHVybnMgc3RyaW5nL3N0cmluZ1tdXHJcbiAgICovXHJcbiAgc3BsaXRTdHJpbmdPbkNhcGl0YWxzKFxyXG4gICAgcmF3U3RyaW5nOiBzdHJpbmcsXHJcbiAgICBqb2luOiBib29sZWFuID0gZmFsc2VcclxuICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBzcGxpdFN0cmluZyA9IHJhd1N0cmluZy5zcGxpdCgvKD89W0EtWl0pLyk7XHJcblxyXG4gICAgaWYgKGpvaW4pIHtcclxuICAgICAgcmV0dXJuIHNwbGl0U3RyaW5nLmpvaW4oJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3BsaXRTdHJpbmc7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|