@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,1022 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
import { BaseEnterpriseSearch } from './base-enterprise';
|
|
4
|
+
import { BehaviorSubject, of, Subject } from 'rxjs';
|
|
5
|
+
import { map, take } from 'rxjs/operators';
|
|
6
|
+
import { URLS } from './../services/url.service';
|
|
7
|
+
import { LocationTypes, includedExpression, excludedExpression, SearchHandler } from '../types/types';
|
|
8
|
+
import { DistanceTypes, ServiceType } from '../types/graphql.types';
|
|
9
|
+
import { HotelFilters, HotelView } from '../interfaces/Ihotel-enterprise-search';
|
|
10
|
+
export var SortTypesHotel;
|
|
11
|
+
(function (SortTypesHotel) {
|
|
12
|
+
SortTypesHotel["distance"] = "distance";
|
|
13
|
+
SortTypesHotel["name"] = "name";
|
|
14
|
+
SortTypesHotel["price"] = "price";
|
|
15
|
+
})(SortTypesHotel || (SortTypesHotel = {}));
|
|
16
|
+
const CLIENT_PREFERRED_VALUE = 1;
|
|
17
|
+
const AGENT_PREFERRED_VALUE = 2;
|
|
18
|
+
export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
19
|
+
constructor(hotelFetcher, helpers, userService, environment, avaliabilityService, basketService, storageService, searchService, httpCallService, quickListFetcher, getRailStationFetcher) {
|
|
20
|
+
super(storageService, (resultsToMap) => {
|
|
21
|
+
this.results_details.maxDistance = 0;
|
|
22
|
+
this.results_details.chains = new Set();
|
|
23
|
+
return resultsToMap.map((hotelResult, index) => {
|
|
24
|
+
this.results_details.maxDistance = Math.max(this.results_details.maxDistance, hotelResult.location.distance);
|
|
25
|
+
this.filters.distanceRange.max = this.results_details.maxDistance;
|
|
26
|
+
this.results_details.chains.add(hotelResult.group);
|
|
27
|
+
if (index < this.environment.numberHotelToPreload) {
|
|
28
|
+
this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotelResult));
|
|
29
|
+
}
|
|
30
|
+
// this.getHotelAvailability(hotelResult);
|
|
31
|
+
return Object.assign({ sortedTags: this.sortTags(hotelResult.tags), Details: {
|
|
32
|
+
distance_airport: 0,
|
|
33
|
+
distance_metro: 0,
|
|
34
|
+
distance_rail: 0,
|
|
35
|
+
airport_details: { name: 'Not returned' },
|
|
36
|
+
metro_details: { name: 'Not returned' },
|
|
37
|
+
rail_details: { name: 'Not returned' }
|
|
38
|
+
} }, hotelResult);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
this.hotelFetcher = hotelFetcher;
|
|
42
|
+
this.helpers = helpers;
|
|
43
|
+
this.userService = userService;
|
|
44
|
+
this.environment = environment;
|
|
45
|
+
this.avaliabilityService = avaliabilityService;
|
|
46
|
+
this.basketService = basketService;
|
|
47
|
+
this.searchService = searchService;
|
|
48
|
+
this.httpCallService = httpCallService;
|
|
49
|
+
this.quickListFetcher = quickListFetcher;
|
|
50
|
+
this.getRailStationFetcher = getRailStationFetcher;
|
|
51
|
+
this.type = ServiceType.Hotel;
|
|
52
|
+
this.location_types = new BehaviorSubject([]);
|
|
53
|
+
this.offices = new BehaviorSubject([]);
|
|
54
|
+
this.lastActivePage = new BehaviorSubject(null);
|
|
55
|
+
this.galleries = {};
|
|
56
|
+
this.occupied = 0;
|
|
57
|
+
this.results_details = {
|
|
58
|
+
chains: new Set(),
|
|
59
|
+
amenities: [],
|
|
60
|
+
maxDistance: 0
|
|
61
|
+
};
|
|
62
|
+
// Event Emitters
|
|
63
|
+
this.filterChange = new Subject();
|
|
64
|
+
this.selectItemMapView = new Subject();
|
|
65
|
+
this.display = {
|
|
66
|
+
minprice: Number.NEGATIVE_INFINITY,
|
|
67
|
+
maxprice: Number.POSITIVE_INFINITY,
|
|
68
|
+
filters: {
|
|
69
|
+
breakfastType: []
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
// public variables
|
|
73
|
+
this.min_date = {
|
|
74
|
+
year: moment().year(),
|
|
75
|
+
month: moment().month() + 1,
|
|
76
|
+
day: moment().date()
|
|
77
|
+
};
|
|
78
|
+
this.min_return_date = {
|
|
79
|
+
year: moment().year(),
|
|
80
|
+
month: moment().month() + 1,
|
|
81
|
+
day: moment().date() + 1 // min 1 night stay
|
|
82
|
+
};
|
|
83
|
+
// private variables
|
|
84
|
+
// don't need to worry about times here - maybe normalise these in the request body?
|
|
85
|
+
this.localFilters = new HotelFilters();
|
|
86
|
+
this.currentView = HotelView.LIST;
|
|
87
|
+
// For NgForing over in the templates
|
|
88
|
+
this._max_no_of_rooms = 4;
|
|
89
|
+
this._max_rooms_array = new Array(this._max_no_of_rooms).fill(0);
|
|
90
|
+
this._max_no_of_occupants = 2;
|
|
91
|
+
this._max_occupant_array = new Array(this._max_no_of_occupants).fill(0);
|
|
92
|
+
this._distance_list = [1, 2, 5, 10, 20, 25]; // copied from old frontend for now
|
|
93
|
+
this._default_currency = null;
|
|
94
|
+
this.resultsSessionName = HotelEnterpriseSearch.STORAGE_SESSION_RESULTS;
|
|
95
|
+
this.query = {};
|
|
96
|
+
this.filterResults = () => {
|
|
97
|
+
this.results.next(this.fullResults.filter((hotel) => {
|
|
98
|
+
return (this.inPriceRange(hotel) &&
|
|
99
|
+
this.inDistanceRange(hotel) &&
|
|
100
|
+
this.containsHotelname(hotel) &&
|
|
101
|
+
this.hasChain(hotel) &&
|
|
102
|
+
this.breakfastTypeFilter(hotel));
|
|
103
|
+
}));
|
|
104
|
+
};
|
|
105
|
+
// Lightening Filters
|
|
106
|
+
this.filterLighteningResults = () => {
|
|
107
|
+
this.results.next(this.fullResults.filter((hotel) => {
|
|
108
|
+
return (this.inLighteningPriceRange(hotel) &&
|
|
109
|
+
this.containsHotelname(hotel) &&
|
|
110
|
+
this.hasChain(hotel) &&
|
|
111
|
+
this.hasPreferred(hotel) &&
|
|
112
|
+
this.breakfastTypeFilter(hotel) &&
|
|
113
|
+
this.getExtraFilter(hotel) &&
|
|
114
|
+
this.getAmenitiesFilter(hotel));
|
|
115
|
+
}));
|
|
116
|
+
};
|
|
117
|
+
this.results_details.chains = new Set();
|
|
118
|
+
const data = storageService.getSessionItem(HotelEnterpriseSearch.STORAGE_SESSION_PARAMS) || {
|
|
119
|
+
tempParams: {}
|
|
120
|
+
};
|
|
121
|
+
this.default_currency = this.tempParams.currency
|
|
122
|
+
? this.tempParams.currency
|
|
123
|
+
: this._default_currency;
|
|
124
|
+
this.updateTempParams(searchService.makeHotelQuery(data.tempParams));
|
|
125
|
+
if (searchService.shouldAddTravellerSubscription()) {
|
|
126
|
+
searchService.travellerInformation.subscribe((travellers) => {
|
|
127
|
+
this.travellers = travellers;
|
|
128
|
+
const splitTravellers = this.helpers.selectedTravellers(travellers, ServiceType.Hotel);
|
|
129
|
+
this.tempParams.no_of_occupants = splitTravellers.adults.length;
|
|
130
|
+
this.travellers = travellers;
|
|
131
|
+
this._isValid();
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const results = storageService.getSessionItemAsList(this.resultsSessionName) || [];
|
|
135
|
+
results
|
|
136
|
+
.slice(0, this.environment.numberHotelToPreload)
|
|
137
|
+
.forEach((hotel) => {
|
|
138
|
+
this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel));
|
|
139
|
+
});
|
|
140
|
+
results.forEach((hotelResult) => {
|
|
141
|
+
this.results_details.chains.add(hotelResult.group);
|
|
142
|
+
});
|
|
143
|
+
this.fullResults = results;
|
|
144
|
+
this.results.next(results);
|
|
145
|
+
this._isValid();
|
|
146
|
+
this.userService.changeUser.subscribe((user) => {
|
|
147
|
+
this.location_types.next([
|
|
148
|
+
LocationTypes.Airport,
|
|
149
|
+
LocationTypes.City,
|
|
150
|
+
LocationTypes.Office,
|
|
151
|
+
LocationTypes.Shortlist,
|
|
152
|
+
LocationTypes.TrainStation
|
|
153
|
+
]);
|
|
154
|
+
if (searchService.shouldFetchAllOffices()) {
|
|
155
|
+
this.offices.next([]); // TODO fetch offices
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
this.localFilters = new HotelFilters();
|
|
159
|
+
this.avaliabilityService.fetching.subscribe((isFetching) => {
|
|
160
|
+
if (!isFetching) {
|
|
161
|
+
// We've just finished fetching avalibility so update filters.
|
|
162
|
+
const maxNumber = this.avaliabilityService.maxPriceForCurrency('GBP');
|
|
163
|
+
if (maxNumber > 0) {
|
|
164
|
+
this.filters.priceRange.max = maxNumber;
|
|
165
|
+
this.localFilters.priceRange.max = maxNumber;
|
|
166
|
+
}
|
|
167
|
+
this._cheapestResultPrice = this.updateLowestPrice(results);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
get chains() {
|
|
172
|
+
return [...this.results_details.chains];
|
|
173
|
+
}
|
|
174
|
+
get amenities() {
|
|
175
|
+
return [...this.results_details.amenities];
|
|
176
|
+
}
|
|
177
|
+
get maxDistance() {
|
|
178
|
+
this.filters.distanceRange.max = Math.ceil(Math.max.apply(Math, this.results.value.map((o) => o.location.distance)));
|
|
179
|
+
this.results_details.maxDistance = this.filters.distanceRange.max;
|
|
180
|
+
return this.results_details.maxDistance;
|
|
181
|
+
}
|
|
182
|
+
get maxPrice() {
|
|
183
|
+
return Math.ceil(this.filters.priceRange.max);
|
|
184
|
+
}
|
|
185
|
+
get currency() {
|
|
186
|
+
return this.tempParams.currency;
|
|
187
|
+
}
|
|
188
|
+
set currency(value) {
|
|
189
|
+
this.tempParams.currency = value;
|
|
190
|
+
}
|
|
191
|
+
// getters and setters
|
|
192
|
+
get checkin_date_ngb() {
|
|
193
|
+
return this._checkin_date_ngb;
|
|
194
|
+
}
|
|
195
|
+
set checkin_date_ngb(value) {
|
|
196
|
+
this._checkin_date_ngb = value;
|
|
197
|
+
this.tempParams.checkin_date = this.helpers.ngDateToMoment(value);
|
|
198
|
+
this.checkin_date = this.helpers.ngDateToMoment(value);
|
|
199
|
+
}
|
|
200
|
+
get checkout_date_ngb() {
|
|
201
|
+
return this._checkout_date_ngb;
|
|
202
|
+
}
|
|
203
|
+
set checkout_date_ngb(value) {
|
|
204
|
+
this._checkout_date_ngb = value;
|
|
205
|
+
this.tempParams.checkout_date = this.helpers.ngDateToMoment(value);
|
|
206
|
+
this._isValid();
|
|
207
|
+
}
|
|
208
|
+
get checkin_date() {
|
|
209
|
+
return this.tempParams.checkin_date;
|
|
210
|
+
}
|
|
211
|
+
set checkin_date(newDate) {
|
|
212
|
+
if (newDate && newDate.isValid()) {
|
|
213
|
+
this.tempParams.checkin_date = moment(newDate);
|
|
214
|
+
this._checkin_date_ngb = this.helpers.momentToNgDate(newDate);
|
|
215
|
+
if (newDate.isSameOrBefore(this.tempParams.checkout_date)) {
|
|
216
|
+
this.checkout_date = moment(newDate).add(1, 'day');
|
|
217
|
+
}
|
|
218
|
+
this._isValid();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
get checkout_date() {
|
|
222
|
+
return this.tempParams.checkout_date;
|
|
223
|
+
}
|
|
224
|
+
set checkout_date(newDate) {
|
|
225
|
+
// if (newDate.isSameOrBefore(this.checkin_date)) { // not allowed
|
|
226
|
+
// return;
|
|
227
|
+
// }
|
|
228
|
+
if (newDate && newDate.isValid()) {
|
|
229
|
+
this.tempParams.checkout_date = newDate;
|
|
230
|
+
this.checkout_date_ngb = this.helpers.momentToNgDate(newDate);
|
|
231
|
+
this._isValid();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
get no_of_rooms() {
|
|
235
|
+
return this.tempParams.no_of_rooms;
|
|
236
|
+
}
|
|
237
|
+
set no_of_rooms(newRooms) {
|
|
238
|
+
if (newRooms > 4 || newRooms < 1) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
this.tempParams.no_of_rooms = newRooms;
|
|
242
|
+
this._isValid();
|
|
243
|
+
}
|
|
244
|
+
get no_of_occupants() {
|
|
245
|
+
return this.tempParams.no_of_occupants;
|
|
246
|
+
}
|
|
247
|
+
set no_of_occupants(newOcc) {
|
|
248
|
+
if (newOcc < 1 || newOcc > 3) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
this.tempParams.no_of_occupants = newOcc;
|
|
252
|
+
this._isValid();
|
|
253
|
+
}
|
|
254
|
+
get default_currency() {
|
|
255
|
+
return this.tempParams.currency;
|
|
256
|
+
}
|
|
257
|
+
set default_currency(currency) {
|
|
258
|
+
this.tempParams.currency = currency;
|
|
259
|
+
}
|
|
260
|
+
// may have to modify these
|
|
261
|
+
get location() {
|
|
262
|
+
return this.tempParams.location;
|
|
263
|
+
}
|
|
264
|
+
set location(newLoc) {
|
|
265
|
+
this.tempParams.location = newLoc;
|
|
266
|
+
this._isValid();
|
|
267
|
+
}
|
|
268
|
+
get formatted_location() {
|
|
269
|
+
return this.tempParams.location
|
|
270
|
+
? this.tempParams.location.destination
|
|
271
|
+
: 'No Location Set'; // TODO - expand this for different types
|
|
272
|
+
}
|
|
273
|
+
get distance() {
|
|
274
|
+
return this.tempParams.distance;
|
|
275
|
+
}
|
|
276
|
+
set distance(newDist) {
|
|
277
|
+
this.tempParams.distance = newDist;
|
|
278
|
+
this._isValid();
|
|
279
|
+
}
|
|
280
|
+
get prefered_hotels_only() {
|
|
281
|
+
return this.tempParams.prefered_hotels_only;
|
|
282
|
+
}
|
|
283
|
+
set prefered_hotels_only(newPref) {
|
|
284
|
+
this.tempParams.prefered_hotels_only = newPref;
|
|
285
|
+
this._isValid();
|
|
286
|
+
}
|
|
287
|
+
get country() {
|
|
288
|
+
return this.tempParams.country;
|
|
289
|
+
}
|
|
290
|
+
set country(newCont) {
|
|
291
|
+
this.tempParams.country = newCont;
|
|
292
|
+
this._isValid();
|
|
293
|
+
}
|
|
294
|
+
get postcode() {
|
|
295
|
+
return this.tempParams.postcode;
|
|
296
|
+
}
|
|
297
|
+
set postcode(postcode) {
|
|
298
|
+
this.tempParams.postcode = postcode;
|
|
299
|
+
this._isValid();
|
|
300
|
+
}
|
|
301
|
+
get trainsStation() {
|
|
302
|
+
return this.tempParams.trainsStation;
|
|
303
|
+
}
|
|
304
|
+
set trainsStation(station) {
|
|
305
|
+
this.tempParams.trainsStation = station;
|
|
306
|
+
this._isValid();
|
|
307
|
+
}
|
|
308
|
+
get office() {
|
|
309
|
+
return this.tempParams.office;
|
|
310
|
+
}
|
|
311
|
+
set office(office) {
|
|
312
|
+
this.tempParams.office = office;
|
|
313
|
+
this._isValid();
|
|
314
|
+
}
|
|
315
|
+
// Additional Variables
|
|
316
|
+
get hotel_name() {
|
|
317
|
+
return this.tempParams.hotel_name;
|
|
318
|
+
}
|
|
319
|
+
set hotel_name(newName) {
|
|
320
|
+
this.tempParams.hotel_name = newName;
|
|
321
|
+
this._isValid();
|
|
322
|
+
}
|
|
323
|
+
get hotel_chain() {
|
|
324
|
+
return this.tempParams.hotel_chain;
|
|
325
|
+
}
|
|
326
|
+
set hotel_chain(newChain) {
|
|
327
|
+
this.tempParams.hotel_chain = newChain;
|
|
328
|
+
this._isValid();
|
|
329
|
+
}
|
|
330
|
+
// Getters Only
|
|
331
|
+
get max_rooms_array() {
|
|
332
|
+
return this._max_rooms_array;
|
|
333
|
+
}
|
|
334
|
+
get max_occupant_array() {
|
|
335
|
+
return this._max_occupant_array;
|
|
336
|
+
}
|
|
337
|
+
get distance_list() {
|
|
338
|
+
return this._distance_list;
|
|
339
|
+
}
|
|
340
|
+
get location_type_select() {
|
|
341
|
+
return this.tempParams.location_type_select;
|
|
342
|
+
}
|
|
343
|
+
set location_type_select(value) {
|
|
344
|
+
this.tempParams.location_type_select = value;
|
|
345
|
+
this._isValid();
|
|
346
|
+
}
|
|
347
|
+
get filters() {
|
|
348
|
+
return this.localFilters;
|
|
349
|
+
}
|
|
350
|
+
makeLocations(location) {
|
|
351
|
+
return this.helpers.arrayToObjectArray(location, 'distanceType');
|
|
352
|
+
}
|
|
353
|
+
sortTags(tags) {
|
|
354
|
+
if (tags) {
|
|
355
|
+
return [...tags]
|
|
356
|
+
.sort((a, b) => {
|
|
357
|
+
if (a.name < b.name) {
|
|
358
|
+
return -1;
|
|
359
|
+
}
|
|
360
|
+
else if (a.name > b.name) {
|
|
361
|
+
return 1;
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
return 0;
|
|
365
|
+
}
|
|
366
|
+
})
|
|
367
|
+
.map((tag) => {
|
|
368
|
+
return Object.assign(Object.assign({}, tag), { icon: this.environment.tagMap[tag.name] || tag.icon });
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
return [];
|
|
372
|
+
}
|
|
373
|
+
resetQuery() {
|
|
374
|
+
this.updateTempParams(this.searchService.makeHotelQuery());
|
|
375
|
+
this.localFilters = new HotelFilters();
|
|
376
|
+
this.results_details = {
|
|
377
|
+
chains: new Set(),
|
|
378
|
+
amenities: [],
|
|
379
|
+
maxDistance: 0
|
|
380
|
+
};
|
|
381
|
+
this._isValid();
|
|
382
|
+
}
|
|
383
|
+
_isValid() {
|
|
384
|
+
var _a, _b, _c, _d, _e;
|
|
385
|
+
if (!this.doChecks) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
this.storageService.setSessionItem(HotelEnterpriseSearch.STORAGE_SESSION_PARAMS, {
|
|
389
|
+
tempParams: this.tempParams
|
|
390
|
+
});
|
|
391
|
+
this.min_return_date = this.helpers.momentToNgDate(this.tempParams.checkin_date);
|
|
392
|
+
if (this.tempParams.checkin_date.isSameOrAfter(this.tempParams.checkout_date)) {
|
|
393
|
+
this.checkout_date = moment(this.tempParams.checkin_date).add(1, 'day'); // ensure that checkout date is min 1 day after checkin date
|
|
394
|
+
}
|
|
395
|
+
this.validationMessages = [];
|
|
396
|
+
switch (this.tempParams.location_type_select) {
|
|
397
|
+
case LocationTypes.City:
|
|
398
|
+
if (!this.country) {
|
|
399
|
+
this.validationMessages.push('Please select country');
|
|
400
|
+
}
|
|
401
|
+
if (!this.location && !this.postcode) {
|
|
402
|
+
this.validationMessages.push('Please select a hotel location or enter a postcode.');
|
|
403
|
+
}
|
|
404
|
+
break;
|
|
405
|
+
case LocationTypes.Office:
|
|
406
|
+
if (!((_a = this.tempParams.location) === null || _a === void 0 ? void 0 : _a.office)) {
|
|
407
|
+
this.validationMessages.push('Please select an office.');
|
|
408
|
+
}
|
|
409
|
+
break;
|
|
410
|
+
case LocationTypes.Airport:
|
|
411
|
+
if ((_b = this.tempParams) === null || _b === void 0 ? void 0 : _b.location) {
|
|
412
|
+
if (!((_c = this.tempParams.location.airport) === null || _c === void 0 ? void 0 : _c.gateway)) {
|
|
413
|
+
this.validationMessages.push('Please select a airport.');
|
|
414
|
+
}
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
this.validationMessages.push('Please select a airport.');
|
|
419
|
+
}
|
|
420
|
+
break;
|
|
421
|
+
case LocationTypes.TrainStation:
|
|
422
|
+
if ((_d = this.tempParams) === null || _d === void 0 ? void 0 : _d.location) {
|
|
423
|
+
if (!((_e = this.tempParams.location.railstation) === null || _e === void 0 ? void 0 : _e.stationCode)) {
|
|
424
|
+
this.validationMessages.push('Please select a train station.');
|
|
425
|
+
}
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
this.validationMessages.push('Please select a train station.');
|
|
430
|
+
}
|
|
431
|
+
break;
|
|
432
|
+
case LocationTypes.Shortlist:
|
|
433
|
+
if (!this.country) {
|
|
434
|
+
this.validationMessages.push('Please select country');
|
|
435
|
+
}
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
if (this.checkout_date &&
|
|
439
|
+
this.checkout_date.isSameOrBefore(this.checkin_date)) {
|
|
440
|
+
this.validationMessages.push('Checkout date must be after checkin date');
|
|
441
|
+
}
|
|
442
|
+
if (this.checkout_date && this.checkout_date.isBefore(moment())) {
|
|
443
|
+
this.validationMessages.push('Checkout date must not be in the past');
|
|
444
|
+
}
|
|
445
|
+
if (this.checkin_date && this.checkin_date.isBefore(moment())) {
|
|
446
|
+
this.validationMessages.push('Checkin date must not be in the past');
|
|
447
|
+
}
|
|
448
|
+
if (this.checkout_date &&
|
|
449
|
+
this.checkin_date &&
|
|
450
|
+
this.checkin_date.isAfter(this.checkout_date)) {
|
|
451
|
+
this.validationMessages.push('Checkout data must be after the checkin date');
|
|
452
|
+
}
|
|
453
|
+
// Calculating Occupancy
|
|
454
|
+
const occupancy = this.no_of_occupants / this.no_of_rooms;
|
|
455
|
+
if (!(occupancy === 1 || occupancy === 2)) {
|
|
456
|
+
this.validationMessages.push('Occupants per room must be 1 or 2, if you have an odd number of travellers (greater than one), the no of rooms must be equal');
|
|
457
|
+
}
|
|
458
|
+
console.log(this.validationMessages);
|
|
459
|
+
this.isValid.next(this.validationMessages.length === 0);
|
|
460
|
+
this.messages.next(this.validationMessages);
|
|
461
|
+
}
|
|
462
|
+
startSearch() {
|
|
463
|
+
this.results.next([]);
|
|
464
|
+
this.avaliabilityService.reset();
|
|
465
|
+
if (this.isValid.value) {
|
|
466
|
+
// build the query
|
|
467
|
+
this.buildQuery();
|
|
468
|
+
const query = this.getSearchQuery();
|
|
469
|
+
this.searchService.saveRecentSearch(this.getRecentSearchQuery(this.getSearchQuery()));
|
|
470
|
+
return this._startSearch(this.tempParams.location_type_select === LocationTypes.Shortlist ?
|
|
471
|
+
this.quickListFetcher.fetchList({ countryCode: this.country.cCode }) :
|
|
472
|
+
this.hotelFetcher.fetchList(query));
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
return Promise.resolve(false);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
getRecentSearchQuery(query) {
|
|
479
|
+
var _a;
|
|
480
|
+
if ((_a = this.location) === null || _a === void 0 ? void 0 : _a.name) {
|
|
481
|
+
query.cityName = this.location.name;
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
serviceType: ServiceType.Hotel,
|
|
485
|
+
searchArgs: query,
|
|
486
|
+
travelDate: this.checkin_date.format(),
|
|
487
|
+
travellers: this.helpers.getTravellersId(this.travellers)
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
startRecentSearch(recentSearch) {
|
|
491
|
+
this.currency = recentSearch.searchArgs.currency;
|
|
492
|
+
this.distance = recentSearch.searchArgs.distance;
|
|
493
|
+
this.no_of_rooms = recentSearch.searchArgs.rooms;
|
|
494
|
+
this.checkin_date = moment(recentSearch.searchArgs.startDate);
|
|
495
|
+
this.checkout_date = moment(recentSearch.searchArgs.endDate);
|
|
496
|
+
this.hotel_name = recentSearch.searchArgs.hotelName;
|
|
497
|
+
if (recentSearch.searchArgs.groupName) {
|
|
498
|
+
this.hotel_chain = {
|
|
499
|
+
name: recentSearch.searchArgs.groupName
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
// get location_type_select
|
|
503
|
+
if (recentSearch.searchArgs.iata) {
|
|
504
|
+
this.location_type_select = LocationTypes.Airport;
|
|
505
|
+
this.searchService.getAirportByCode(recentSearch.searchArgs.iata).subscribe((iata) => {
|
|
506
|
+
let airport = {
|
|
507
|
+
airport: {
|
|
508
|
+
gateway: iata.iataMatch.iata
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
this.location = Object.assign(Object.assign({}, airport), iata.iataMatch);
|
|
512
|
+
this.searchService.startSearches();
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
else if ((recentSearch.searchArgs.latitude && recentSearch.searchArgs.longitude) || recentSearch.searchArgs.postOrZipCode) {
|
|
516
|
+
this.location_type_select = LocationTypes.City;
|
|
517
|
+
this.country = {
|
|
518
|
+
cCode: recentSearch.searchArgs.countryCode,
|
|
519
|
+
cName: ''
|
|
520
|
+
};
|
|
521
|
+
// should be one search metod for the city search: location or postcode
|
|
522
|
+
if (recentSearch.searchArgs.latitude && recentSearch.searchArgs.longitude) {
|
|
523
|
+
this.location = {
|
|
524
|
+
name: recentSearch.searchArgs.cityName,
|
|
525
|
+
latitude: recentSearch.searchArgs.latitude,
|
|
526
|
+
longitude: recentSearch.searchArgs.longitude
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
else if (recentSearch.searchArgs.postOrZipCode) {
|
|
530
|
+
this.postcode = {
|
|
531
|
+
name: recentSearch.searchArgs.postOrZipCode,
|
|
532
|
+
type: LocationTypes.Postcode
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
this.searchService.startSearches();
|
|
536
|
+
}
|
|
537
|
+
else if (recentSearch.searchArgs.officeId) {
|
|
538
|
+
this.location_type_select = LocationTypes.Office;
|
|
539
|
+
this.searchService.getOfficeNames(this.isLoading).pipe(take(1)).subscribe((offices) => {
|
|
540
|
+
if (offices) {
|
|
541
|
+
let office = offices.find((office) => office.id === recentSearch.searchArgs.officeId);
|
|
542
|
+
this.office = {
|
|
543
|
+
id: recentSearch.searchArgs.officeId,
|
|
544
|
+
name: office.name
|
|
545
|
+
};
|
|
546
|
+
this.searchService.startSearches();
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
else if (recentSearch.searchArgs.trainStationCode) {
|
|
551
|
+
this.location_type_select = LocationTypes.TrainStation;
|
|
552
|
+
this.getRailStationByCode(recentSearch.searchArgs.trainStationCode).subscribe((trainsStation) => {
|
|
553
|
+
this.trainsStation = trainsStation;
|
|
554
|
+
this.searchService.startSearches();
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
this.location_type_select = LocationTypes.Shortlist;
|
|
559
|
+
this.country = {
|
|
560
|
+
cCode: recentSearch.searchArgs.countryCode,
|
|
561
|
+
cName: ''
|
|
562
|
+
};
|
|
563
|
+
this.searchService.startSearches();
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
getRailStationByCode(code) {
|
|
567
|
+
if (code) {
|
|
568
|
+
return this.getRailStationFetcher.fetchList({ id: null, code: code }).pipe(take(1));
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
return of();
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
getSearchQuery() {
|
|
575
|
+
this.buildQuery();
|
|
576
|
+
return this.helpers.removeNulls(this.query);
|
|
577
|
+
}
|
|
578
|
+
buildQuery() {
|
|
579
|
+
var _a, _b;
|
|
580
|
+
const query = {
|
|
581
|
+
startDate: this.tempParams.checkin_date.format('YYYY-MM-DD'),
|
|
582
|
+
endDate: this.tempParams.checkout_date.format('YYYY-MM-DD'),
|
|
583
|
+
rooms: this.tempParams.no_of_rooms,
|
|
584
|
+
adults: this.tempParams.no_of_occupants,
|
|
585
|
+
currency: this.tempParams.currency ? this.tempParams.currency : null,
|
|
586
|
+
distance: this.tempParams.distance,
|
|
587
|
+
distanceType: DistanceTypes.M,
|
|
588
|
+
maxResults: 100
|
|
589
|
+
};
|
|
590
|
+
this.getRoomNumber();
|
|
591
|
+
console.log(this.location);
|
|
592
|
+
switch (this.tempParams.location_type_select) {
|
|
593
|
+
case LocationTypes.Airport:
|
|
594
|
+
query.iata = this.tempParams.location.airport.gateway;
|
|
595
|
+
break;
|
|
596
|
+
case LocationTypes.City:
|
|
597
|
+
query.countryCode = this.country.cCode;
|
|
598
|
+
// should be one search metod for the city search: location or postcode
|
|
599
|
+
if (this.location) {
|
|
600
|
+
query.latitude = this.location.latitude;
|
|
601
|
+
query.longitude = this.location.longitude;
|
|
602
|
+
}
|
|
603
|
+
else if (this.postcode) {
|
|
604
|
+
query.postOrZipCode = this.postcode.name;
|
|
605
|
+
}
|
|
606
|
+
break;
|
|
607
|
+
case LocationTypes.TrainStation:
|
|
608
|
+
query.trainStationCode = this.location.railstation.stationCode;
|
|
609
|
+
break;
|
|
610
|
+
case LocationTypes.Office: // Needs to fix in next PR
|
|
611
|
+
query.officeId = +((_a = this.location.office) === null || _a === void 0 ? void 0 : _a.id);
|
|
612
|
+
break;
|
|
613
|
+
case LocationTypes.Shortlist:
|
|
614
|
+
query.countryCode = this.country.cCode;
|
|
615
|
+
break;
|
|
616
|
+
}
|
|
617
|
+
// Add hotel name in the query
|
|
618
|
+
if (this.hotel_name) {
|
|
619
|
+
query.hotelName = this.tempParams.hotel_name;
|
|
620
|
+
}
|
|
621
|
+
// add chain or group name int he query
|
|
622
|
+
if (this.hotel_chain) {
|
|
623
|
+
query.groupName = (_b = this.tempParams.hotel_chain) === null || _b === void 0 ? void 0 : _b.name;
|
|
624
|
+
}
|
|
625
|
+
this.query = query;
|
|
626
|
+
}
|
|
627
|
+
makeHotelAvalilityObject(hotel) {
|
|
628
|
+
return {
|
|
629
|
+
hotel: hotel.id,
|
|
630
|
+
startDate: this.helpers.formatIsoDate(this.checkin_date),
|
|
631
|
+
endDate: this.helpers.formatIsoDate(this.checkout_date),
|
|
632
|
+
rooms: this.no_of_rooms,
|
|
633
|
+
occupants: this.no_of_occupants,
|
|
634
|
+
currency: 'GBP'
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
inPriceRange(hotel) {
|
|
638
|
+
const availability = this.avaliabilityService.getAvailabilityValue(hotel);
|
|
639
|
+
if (availability) {
|
|
640
|
+
return (this.helpers.inRange(availability.maxprice, this.filters.priceRange) &&
|
|
641
|
+
this.helpers.inRange(availability.minprice, this.filters.priceRange));
|
|
642
|
+
}
|
|
643
|
+
return false;
|
|
644
|
+
}
|
|
645
|
+
inDistanceRange(hotel) {
|
|
646
|
+
return (this.filters.distanceRange.max === 0 ||
|
|
647
|
+
this.helpers.inRange(hotel.location.distance, this.filters.distanceRange));
|
|
648
|
+
}
|
|
649
|
+
containsHotelname(hotel) {
|
|
650
|
+
const tocheck = this.filters.hotelName.toLowerCase();
|
|
651
|
+
return tocheck && tocheck.length > 0
|
|
652
|
+
? hotel.name.toLowerCase().includes(tocheck)
|
|
653
|
+
: true;
|
|
654
|
+
}
|
|
655
|
+
inLighteningPriceRange(hotel) {
|
|
656
|
+
const availability = this.avaliabilityService.getAvailabilityValue(hotel);
|
|
657
|
+
if (availability && Object.keys(availability).length !== 0) {
|
|
658
|
+
let maxRange = false;
|
|
659
|
+
let findMax = 0;
|
|
660
|
+
let minRange = this.helpers.inRange(availability.prpn, this.filters.priceRange);
|
|
661
|
+
if (availability === null || availability === void 0 ? void 0 : availability.maxprice) {
|
|
662
|
+
findMax = availability.maxprice;
|
|
663
|
+
}
|
|
664
|
+
else {
|
|
665
|
+
findMax = availability === null || availability === void 0 ? void 0 : availability.rooms.reduce((op, item) => (op = op > item.total ? op : item.total), 0);
|
|
666
|
+
}
|
|
667
|
+
maxRange = this.helpers.inRange(findMax, this.filters.priceRange);
|
|
668
|
+
let result = minRange && maxRange;
|
|
669
|
+
return result;
|
|
670
|
+
}
|
|
671
|
+
return true;
|
|
672
|
+
}
|
|
673
|
+
hasChain(hotel) {
|
|
674
|
+
const tocheck = (this.filters.chain || []).map((chain) => {
|
|
675
|
+
return chain.toLowerCase();
|
|
676
|
+
});
|
|
677
|
+
return tocheck && tocheck.length
|
|
678
|
+
? !!tocheck.find((chain) => {
|
|
679
|
+
return hotel.group.toLowerCase().includes(chain);
|
|
680
|
+
})
|
|
681
|
+
: true;
|
|
682
|
+
}
|
|
683
|
+
breakfastTypeFilter(hotel) {
|
|
684
|
+
if (!this.filters.breakfastType.length)
|
|
685
|
+
return true;
|
|
686
|
+
const hotelObject = this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel));
|
|
687
|
+
if (!hotelObject && !hotelObject.value)
|
|
688
|
+
return false;
|
|
689
|
+
const hotelObjectValue = hotelObject.value;
|
|
690
|
+
const isBreakfastIncluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_INCLUDED);
|
|
691
|
+
const isBreakfastExcluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_NOT_INCLUDED);
|
|
692
|
+
const breakfastMatches = hotelObjectValue.rooms.filter((rooms) => {
|
|
693
|
+
if (isBreakfastIncluded && isBreakfastExcluded) {
|
|
694
|
+
return rooms;
|
|
695
|
+
}
|
|
696
|
+
else if (isBreakfastIncluded) {
|
|
697
|
+
return rooms.rateDescription.match(includedExpression) && !rooms.rateDescription.match(excludedExpression);
|
|
698
|
+
}
|
|
699
|
+
else if (isBreakfastExcluded) {
|
|
700
|
+
return !rooms.rateDescription.match(includedExpression) || rooms.rateDescription.match(excludedExpression);
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
return !!breakfastMatches.length;
|
|
704
|
+
}
|
|
705
|
+
byMostExpensive() {
|
|
706
|
+
this.sortByPrice(false);
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* @param {boolean} min
|
|
710
|
+
* @param {boolean} debug set this to true to output console logs
|
|
711
|
+
* @description sorts results by price according to the 'min' paramater. min = true (lowest price first), min = false (highest price first)
|
|
712
|
+
* In summary, this method creates a sorted array of hotels with prices and an array of hotels WITHOUT prices,
|
|
713
|
+
* then finally joins these 2 temporary arrays together before triggering the next observable.
|
|
714
|
+
*/
|
|
715
|
+
sortByPrice(min = true, debug = false) {
|
|
716
|
+
// store all results
|
|
717
|
+
const hotels = this.fullResults;
|
|
718
|
+
// get hotels with and without prices
|
|
719
|
+
const hotelsWithPrices = [];
|
|
720
|
+
const hotelsWithoutPrices = [];
|
|
721
|
+
hotels.map((hotelResult) => {
|
|
722
|
+
var _a;
|
|
723
|
+
((_a = this.avaliabilityService.getAvailabilityValue(hotelResult)) === null || _a === void 0 ? void 0 : _a.prpn) ? hotelsWithPrices.push(hotelResult)
|
|
724
|
+
: hotelsWithoutPrices.push(hotelResult);
|
|
725
|
+
});
|
|
726
|
+
// sort hotels with prices according to the 'min' parameter for the order
|
|
727
|
+
hotelsWithPrices.sort((first, second) => {
|
|
728
|
+
var _a, _b;
|
|
729
|
+
const firstPrice = (_a = this.avaliabilityService.getAvailabilityValue(first)) === null || _a === void 0 ? void 0 : _a.prpn;
|
|
730
|
+
const secondPrice = (_b = this.avaliabilityService.getAvailabilityValue(second)) === null || _b === void 0 ? void 0 : _b.prpn;
|
|
731
|
+
return min
|
|
732
|
+
? firstPrice > secondPrice
|
|
733
|
+
? 1
|
|
734
|
+
: secondPrice > firstPrice
|
|
735
|
+
? -1
|
|
736
|
+
: 0
|
|
737
|
+
: firstPrice < secondPrice
|
|
738
|
+
? 1
|
|
739
|
+
: secondPrice < firstPrice
|
|
740
|
+
? -1
|
|
741
|
+
: 0;
|
|
742
|
+
});
|
|
743
|
+
// join hotels with prices to hotels WITHOUT prices
|
|
744
|
+
const sortedHotels = [...hotelsWithPrices, ...hotelsWithoutPrices];
|
|
745
|
+
// trigger next observable
|
|
746
|
+
this.results.next(sortedHotels);
|
|
747
|
+
// display console logs if debug is true (could prove useful in future)
|
|
748
|
+
if (debug) {
|
|
749
|
+
console.log('++ sortByPrice() called ++');
|
|
750
|
+
console.log('++ hotel ++', hotels);
|
|
751
|
+
console.log('++ hotelsWithPrices ++', hotelsWithPrices);
|
|
752
|
+
console.log('++ hotelsWithoutPrices ++', hotelsWithoutPrices);
|
|
753
|
+
console.log('++ sortedHotels ++', sortedHotels);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
sortByName() {
|
|
757
|
+
this.results.next(this.results.value.sort((fst, snd) => {
|
|
758
|
+
return fst.name.toLowerCase().localeCompare(snd.name.toLowerCase());
|
|
759
|
+
}));
|
|
760
|
+
}
|
|
761
|
+
sortByDistance() {
|
|
762
|
+
let results = this.results.value || [];
|
|
763
|
+
results = results.sort((a, b) => {
|
|
764
|
+
return Number(a.location.distance) - Number(b.location.distance);
|
|
765
|
+
});
|
|
766
|
+
this.results.next(results);
|
|
767
|
+
}
|
|
768
|
+
byPreferred() {
|
|
769
|
+
let results = this.results.value || [];
|
|
770
|
+
results = results.sort((a, b) => {
|
|
771
|
+
return this.preferredToInt(b) - this.preferredToInt(a);
|
|
772
|
+
});
|
|
773
|
+
this.results.next(results);
|
|
774
|
+
}
|
|
775
|
+
preferredToInt(hotel) {
|
|
776
|
+
return ((hotel.preferred.client ? CLIENT_PREFERRED_VALUE : 0) +
|
|
777
|
+
(hotel.preferred.consumer ? AGENT_PREFERRED_VALUE : 0));
|
|
778
|
+
}
|
|
779
|
+
intToPreferred(preferred) {
|
|
780
|
+
return {
|
|
781
|
+
// tslint:disable-next-line: no-bitwise
|
|
782
|
+
client: (preferred & CLIENT_PREFERRED_VALUE) === CLIENT_PREFERRED_VALUE,
|
|
783
|
+
// tslint:disable-next-line: no-bitwise
|
|
784
|
+
consumer: (preferred & AGENT_PREFERRED_VALUE) === AGENT_PREFERRED_VALUE
|
|
785
|
+
};
|
|
786
|
+
}
|
|
787
|
+
addFilter(filter, type) {
|
|
788
|
+
const filt = this.localFilters;
|
|
789
|
+
filt[type].push(filter);
|
|
790
|
+
}
|
|
791
|
+
removeFilter(filter, type) {
|
|
792
|
+
const filt = this.localFilters;
|
|
793
|
+
if (Array.isArray(filt[type])) {
|
|
794
|
+
filt[type] = filt[type].filter((chain) => {
|
|
795
|
+
return filter !== chain;
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
resetFilters() {
|
|
800
|
+
this.localFilters.chain = [];
|
|
801
|
+
this.localFilters.amenitytype = [];
|
|
802
|
+
this.localFilters.preferred = [];
|
|
803
|
+
this.localFilters.extra = [];
|
|
804
|
+
this.localFilters.hotelName = '';
|
|
805
|
+
this.localFilters.breakfastType = [];
|
|
806
|
+
}
|
|
807
|
+
updateFromPreviousSearches(previousItems) {
|
|
808
|
+
var _a;
|
|
809
|
+
const flightItem = (_a = previousItems[ServiceType.Flight]) === null || _a === void 0 ? void 0 : _a.searchQuery;
|
|
810
|
+
if (flightItem) {
|
|
811
|
+
// TODO flights haven't been done yet.
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
hasPreferred(hotel) {
|
|
815
|
+
const preferredFilters = this.filters.preferred;
|
|
816
|
+
// Empty preferred filters OR "Any"
|
|
817
|
+
if (!preferredFilters.length ||
|
|
818
|
+
preferredFilters.includes(SearchHandler.ANY)) {
|
|
819
|
+
return true;
|
|
820
|
+
}
|
|
821
|
+
// Agency (consumer) && Client
|
|
822
|
+
if (preferredFilters.includes(SearchHandler.AGENCY) &&
|
|
823
|
+
preferredFilters.includes(SearchHandler.CLIENT)) {
|
|
824
|
+
return (hotel.preferred.consumer === true && hotel.preferred.client === true);
|
|
825
|
+
}
|
|
826
|
+
// Agency
|
|
827
|
+
if (preferredFilters.includes(SearchHandler.AGENCY)) {
|
|
828
|
+
return hotel.preferred.consumer === true;
|
|
829
|
+
}
|
|
830
|
+
// Client
|
|
831
|
+
if (preferredFilters.includes(SearchHandler.CLIENT)) {
|
|
832
|
+
return hotel.preferred.client === true;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
getmaxPriceForCurrency(currency) {
|
|
836
|
+
return this.avaliabilityService.maxPriceForCurrency(currency);
|
|
837
|
+
}
|
|
838
|
+
// Lightening Extra Filters
|
|
839
|
+
getExtraFilter(hotel) {
|
|
840
|
+
const checkAvailability = this.filters.extra.includes(SearchHandler.AVAILABILITY);
|
|
841
|
+
if (checkAvailability) {
|
|
842
|
+
return hotel.unavailable === true;
|
|
843
|
+
}
|
|
844
|
+
const checkFemaleFriendly = this.filters.extra.includes(SearchHandler.FEMALE_FRIENDLY);
|
|
845
|
+
if (checkFemaleFriendly) {
|
|
846
|
+
return (hotel.tags.filter((tag) => {
|
|
847
|
+
if (tag.name) {
|
|
848
|
+
let name = this.convertToOneString(tag.name).toLowerCase();
|
|
849
|
+
return name.includes(this.convertToOneString(SearchHandler.FEMALE_FRIENDLY).toLowerCase());
|
|
850
|
+
}
|
|
851
|
+
else {
|
|
852
|
+
return true;
|
|
853
|
+
}
|
|
854
|
+
}).length > 0);
|
|
855
|
+
}
|
|
856
|
+
return true;
|
|
857
|
+
}
|
|
858
|
+
// Lightening Amernities Filters
|
|
859
|
+
getAmenitiesFilter(hotel) {
|
|
860
|
+
let isTrue = true;
|
|
861
|
+
this.filters.amenitytype.forEach((search) => {
|
|
862
|
+
let filteredResults = hotel.tags.filter((tag) => {
|
|
863
|
+
if (tag.name) {
|
|
864
|
+
let name = this.convertToOneString(tag.name).toLowerCase();
|
|
865
|
+
if (name.includes(this.convertToOneString(search).toLowerCase())) {
|
|
866
|
+
return true;
|
|
867
|
+
}
|
|
868
|
+
return false;
|
|
869
|
+
}
|
|
870
|
+
});
|
|
871
|
+
isTrue = filteredResults && filteredResults.length > 0 ? true : false;
|
|
872
|
+
// console.log(`Hotel ${hotel.name} with filter applied`, hotel?.tags, isTrue);
|
|
873
|
+
return isTrue;
|
|
874
|
+
});
|
|
875
|
+
return isTrue;
|
|
876
|
+
}
|
|
877
|
+
convertToOneString(item) {
|
|
878
|
+
return item.replace(/[^a-zA-Z]/g, '');
|
|
879
|
+
}
|
|
880
|
+
getImages(HolidayCode) {
|
|
881
|
+
const url = this.environment.hostBaseUrl +
|
|
882
|
+
URLS.CONFIRMA_PHOTO_URL +
|
|
883
|
+
HolidayCode.split(',')[0];
|
|
884
|
+
const imgProvider = 'https://www.vfmii.com/'; // img provider thats holds images, used to match which images on page belongs to gallery.
|
|
885
|
+
if (this.galleries[HolidayCode]) {
|
|
886
|
+
return of(this.galleries[HolidayCode]);
|
|
887
|
+
}
|
|
888
|
+
return this.httpCallService.get(url, { responseType: 'text' }).pipe(map((imagesHTML) => {
|
|
889
|
+
if (!imagesHTML) {
|
|
890
|
+
throw Error(`Gallery for ${HolidayCode} can not be loaded.`);
|
|
891
|
+
}
|
|
892
|
+
const temp = document.createElement('div');
|
|
893
|
+
temp.innerHTML = imagesHTML;
|
|
894
|
+
const images = Array.from(temp.getElementsByTagName('img')).reduce((acc, img) => {
|
|
895
|
+
if (img.src.includes(imgProvider)) {
|
|
896
|
+
acc.push(img.src);
|
|
897
|
+
}
|
|
898
|
+
return acc;
|
|
899
|
+
}, []);
|
|
900
|
+
if (!images.length) {
|
|
901
|
+
throw Error(`There is no media content provided for this hotel ${HolidayCode}`);
|
|
902
|
+
}
|
|
903
|
+
return (this.galleries[HolidayCode] = images);
|
|
904
|
+
}));
|
|
905
|
+
}
|
|
906
|
+
addPaginationPage(currentPage) {
|
|
907
|
+
const key = 'PaginationPageCount';
|
|
908
|
+
this.storageService.setSessionItem(key, currentPage);
|
|
909
|
+
return this.storageService.getSessionItem(key);
|
|
910
|
+
}
|
|
911
|
+
toggleView() {
|
|
912
|
+
if (this.currentView === HotelView.LIST) {
|
|
913
|
+
this.currentView = HotelView.MAP;
|
|
914
|
+
}
|
|
915
|
+
else {
|
|
916
|
+
this.currentView = HotelView.LIST;
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
calcDayDiff() {
|
|
920
|
+
const checkout = moment(this.checkout_date);
|
|
921
|
+
const checkin = moment(this.checkin_date);
|
|
922
|
+
return checkout.startOf().diff(checkin.startOf(), 'days');
|
|
923
|
+
}
|
|
924
|
+
updateLowestPrice(results) {
|
|
925
|
+
const currenciesKey = Object.keys(this.avaliabilityService.currencies);
|
|
926
|
+
if ((!results.length && !currenciesKey.length) || !currenciesKey.length)
|
|
927
|
+
return null;
|
|
928
|
+
const currencie = currenciesKey[0];
|
|
929
|
+
return {
|
|
930
|
+
amount: this.avaliabilityService.currencies[currencie].minprice,
|
|
931
|
+
currencyCode: currencie
|
|
932
|
+
};
|
|
933
|
+
}
|
|
934
|
+
getRoomNumber() {
|
|
935
|
+
let roomsOccupancy = [];
|
|
936
|
+
for (let i = 0; i < Number(this.tempParams.no_of_rooms); i++) {
|
|
937
|
+
const newRoomOccupancy = {
|
|
938
|
+
Adults: this.calcRoomOccupancy(this.tempParams.no_of_rooms, this.tempParams.no_of_occupants),
|
|
939
|
+
Children: 0,
|
|
940
|
+
Infants: 0
|
|
941
|
+
};
|
|
942
|
+
roomsOccupancy.push(newRoomOccupancy);
|
|
943
|
+
}
|
|
944
|
+
let rooms = [];
|
|
945
|
+
for (let index = 0; index < roomsOccupancy.length; index++) {
|
|
946
|
+
for (let j = 0; j < roomsOccupancy[index].Adults; j++) {
|
|
947
|
+
rooms.push(index + 1);
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
// --- should we add new property roomNumber for traveller? --
|
|
951
|
+
// for (let index = 0; index < this.travellers.length; index++) {
|
|
952
|
+
// this.travellers[index].roomNumber = rooms[index];
|
|
953
|
+
// };
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* @desc - return the occupancy for a room - need to calculate based on no of rooms, no of travellers and currently occupied rooms;
|
|
957
|
+
**/
|
|
958
|
+
calcRoomOccupancy(no_of_rooms, travellers) {
|
|
959
|
+
console.log('No of Travellers: ' + travellers + '| No of rooms: ' + no_of_rooms + ' | Assigned: ' + this.occupied);
|
|
960
|
+
let roomOccupancy = Math.ceil(travellers / no_of_rooms);
|
|
961
|
+
if (travellers - this.occupied < roomOccupancy) {
|
|
962
|
+
console.log('We have run out of occupiers!');
|
|
963
|
+
roomOccupancy = travellers - this.occupied;
|
|
964
|
+
}
|
|
965
|
+
if (roomOccupancy <= 0) {
|
|
966
|
+
roomOccupancy = 1;
|
|
967
|
+
}
|
|
968
|
+
this.occupied += roomOccupancy;
|
|
969
|
+
return roomOccupancy;
|
|
970
|
+
}
|
|
971
|
+
addHotelRoomToBasket(hotel, hotelRoom, hotelQuery, travellers) {
|
|
972
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
973
|
+
if (hotel.unavailable) {
|
|
974
|
+
return Promise.resolve(false);
|
|
975
|
+
}
|
|
976
|
+
// modify the 'startDate' and 'endDate' properties to have ISO format
|
|
977
|
+
hotelQuery.startDate = new Date(hotelQuery.startDate).toISOString();
|
|
978
|
+
hotelQuery.endDate = new Date(hotelQuery.endDate).toISOString();
|
|
979
|
+
// create copy of hotelQuery and delete 'adults' property as searchQuerySchema for hotel (conferma) does not seem to support it being added
|
|
980
|
+
const searchQuery = Object.assign({}, hotelQuery);
|
|
981
|
+
delete searchQuery.adults;
|
|
982
|
+
const intBasket = yield this.basketService.getDefaultBasket();
|
|
983
|
+
const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
|
|
984
|
+
if (basket) {
|
|
985
|
+
const { address: hotelAaddress } = hotel;
|
|
986
|
+
const { rateDescription, roomDescription, roomId, roomType } = hotelRoom;
|
|
987
|
+
return this.basketService.addToBasket({
|
|
988
|
+
adults: hotelQuery.adults,
|
|
989
|
+
basket: basket.id,
|
|
990
|
+
service: hotel.sourceId.toString(),
|
|
991
|
+
detail: {
|
|
992
|
+
checkIn: hotelQuery.startDate,
|
|
993
|
+
checkOut: hotelQuery.endDate,
|
|
994
|
+
hotelAddress: {
|
|
995
|
+
streetName: hotelAaddress.addressLine1,
|
|
996
|
+
town: hotelAaddress.addressLine2,
|
|
997
|
+
county: hotelAaddress.addressLine3,
|
|
998
|
+
postcode: hotelAaddress.postOrZipCode,
|
|
999
|
+
countryCode: hotelAaddress.countryCode
|
|
1000
|
+
},
|
|
1001
|
+
hotelDescription: hotel.group,
|
|
1002
|
+
hotelName: hotel.name,
|
|
1003
|
+
numberOfRooms: hotelQuery.rooms,
|
|
1004
|
+
rateDescription,
|
|
1005
|
+
roomDescription,
|
|
1006
|
+
roomId,
|
|
1007
|
+
roomType
|
|
1008
|
+
},
|
|
1009
|
+
price: hotelRoom.total,
|
|
1010
|
+
currency: hotelRoom.currencyCode,
|
|
1011
|
+
searchQuery,
|
|
1012
|
+
outboundDate: hotelQuery.startDate
|
|
1013
|
+
}, intBasket, this.searchService, this.travellers);
|
|
1014
|
+
}
|
|
1015
|
+
return Promise.resolve(false);
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
HotelEnterpriseSearch.MAX_HOTEL_ROOMS = 4;
|
|
1020
|
+
HotelEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_hotel';
|
|
1021
|
+
HotelEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_hotel';
|
|
1022
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFRLEVBQUUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUlMLGFBQWEsRUFJYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFHZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFJTCxhQUFhLEVBUWIsV0FBVyxFQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFpQmhDLE9BQU8sRUFNTCxZQUFZLEVBRVosU0FBUyxFQUVWLE1BQU0sd0NBQXdDLENBQUM7QUFNaEQsTUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN4Qix1Q0FBcUIsQ0FBQTtJQUNyQiwrQkFBYSxDQUFBO0lBQ2IsaUNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSlcsY0FBYyxLQUFkLGNBQWMsUUFJekI7QUFFRCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUVoQyxNQUFNLE9BQU8scUJBTVgsU0FBUSxvQkFJUDtJQTRTRCxZQUNVLFlBQXlDLEVBQ3pDLE9BQTJCLEVBQzNCLFdBQWlDLEVBQ2pDLFdBQTRCLEVBQzVCLG1CQUFzRCxFQUN0RCxhQUErQyxFQUN2RCxjQUFrQyxFQUMxQixhQUErQyxFQUMvQyxlQUF3QyxFQUN4QyxnQkFBMEQsRUFDMUQscUJBQXVEO1FBRS9ELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxZQUFtQyxFQUFFLEVBQUU7WUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7WUFDaEQsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUNyQixDQUFDLFdBQTZCLEVBQUUsS0FBYSxFQUFnQixFQUFFO2dCQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFDaEMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQzlCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFO29CQUNqRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQzNDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FDM0MsQ0FBQztpQkFDSDtnQkFDRCwwQ0FBMEM7Z0JBQzFDLHVCQUNFLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDM0MsT0FBTyxFQUFFO3dCQUNQLGdCQUFnQixFQUFFLENBQUM7d0JBQ25CLGNBQWMsRUFBRSxDQUFDO3dCQUNqQixhQUFhLEVBQUUsQ0FBQzt3QkFDaEIsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRTt3QkFDekMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRTt3QkFDdkMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRTtxQkFDdkMsSUFFRSxXQUFXLEVBQ2Q7WUFDSixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBNUNLLGlCQUFZLEdBQVosWUFBWSxDQUE2QjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBc0I7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBbUM7UUFDdEQsa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBRS9DLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQUMvQyxvQkFBZSxHQUFmLGVBQWUsQ0FBeUI7UUFDeEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQztRQUMxRCwwQkFBcUIsR0FBckIscUJBQXFCLENBQWtDO1FBalQxRCxTQUFJLEdBQWdCLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFFdEMsbUJBQWMsR0FBcUMsSUFBSSxlQUFlLENBRTNFLEVBQUUsQ0FBQyxDQUFDO1FBQ0MsWUFBTyxHQUFxQyxJQUFJLGVBQWUsQ0FFcEUsRUFBRSxDQUFDLENBQUM7UUFDQyxtQkFBYyxHQUE0QixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRSxjQUFTLEdBQWdDLEVBQUUsQ0FBQztRQUM3QyxhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLG9CQUFlLEdBQWtCO1lBQ3ZDLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBVTtZQUN6QixTQUFTLEVBQUUsRUFBRTtZQUNiLFdBQVcsRUFBRSxDQUFDO1NBQ2YsQ0FBQztRQWtDRixpQkFBaUI7UUFDVixpQkFBWSxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNDLHNCQUFpQixHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRWhELFlBQU8sR0FBMEI7WUFDdEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDbEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDbEMsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxFQUFFO2FBQ2xCO1NBQ0YsQ0FBQztRQUVGLG1CQUFtQjtRQUNaLGFBQVEsR0FBRztZQUNoQixJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQzNCLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUU7U0FDckIsQ0FBQztRQUVLLG9CQUFlLEdBQUc7WUFDdkIsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUMzQixHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQjtTQUM3QyxDQUFDO1FBRUYsb0JBQW9CO1FBQ3BCLG9GQUFvRjtRQUU1RSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbkMsZ0JBQVcsR0FBYyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBRS9DLHFDQUFxQztRQUM3QixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDckIscUJBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELHlCQUFvQixHQUFHLENBQUMsQ0FBQztRQUN6Qix3QkFBbUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsbUJBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQ0FBbUM7UUFDM0Usc0JBQWlCLEdBQVEsSUFBSSxDQUFDO1FBeVU1Qix1QkFBa0IsR0FBRyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQztRQUVyRSxVQUFLLEdBQStCLEVBQWdDLENBQUM7UUFxVnRFLGtCQUFhLEdBQUcsR0FBRyxFQUFFO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBbUIsRUFBRSxFQUFFO2dCQUM5QyxPQUFPLENBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO29CQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO29CQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDcEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUNoQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLHFCQUFxQjtRQUNkLDRCQUF1QixHQUFHLEdBQUcsRUFBRTtZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtnQkFDOUMsT0FBTyxDQUNMLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7b0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztvQkFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztvQkFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7b0JBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FDL0IsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUM7UUFqY0EsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FFTixjQUFjLENBQUMsY0FBYyxDQUMvQixxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FDN0MsSUFBSTtZQUNELFVBQVUsRUFBRSxFQUFxQjtTQUNsQyxDQUFDO1FBRUosSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1lBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFckUsSUFBSSxhQUFhLENBQUMsOEJBQThCLEVBQUUsRUFBRTtZQUNsRCxhQUFhLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUMxQyxDQUFDLFVBQXVCLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7Z0JBQzdCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQ3JELFVBQVUsRUFDVixXQUFXLENBQUMsS0FBSyxDQUNsQixDQUFDO2dCQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLENBQUMsQ0FDRixDQUFDO1NBQ0g7UUFFRCxNQUFNLE9BQU8sR0FDWCxjQUFjLENBQUMsb0JBQW9CLENBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPO2FBQ0osS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDO2FBQy9DLE9BQU8sQ0FBQyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQzNDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FDckMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUwsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQXlCLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWhCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQThCLEVBQUUsRUFBRTtZQUN2RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDdkIsYUFBYSxDQUFDLE9BQU87Z0JBQ3JCLGFBQWEsQ0FBQyxJQUFJO2dCQUNsQixhQUFhLENBQUMsTUFBTTtnQkFDcEIsYUFBYSxDQUFDLFNBQVM7Z0JBQ3ZCLGFBQWEsQ0FBQyxZQUFZO2FBQzNCLENBQUMsQ0FBQztZQUNILElBQUksYUFBYSxDQUFDLHFCQUFxQixFQUFFLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMscUJBQXFCO2FBQzdDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFtQixFQUFFLEVBQUU7WUFDbEUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDZiw4REFBOEQ7Z0JBRTlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO29CQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO29CQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO2lCQUM5QztnQkFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzdEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBM1lELElBQUksTUFBTTtRQUNSLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUNuRCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBeUNELHNCQUFzQjtJQUV0QixJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUN2QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLGlCQUFpQixDQUFDLEtBQW9CO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxPQUFzQjtRQUNyQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNwRDtZQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxPQUFzQjtRQUN0QyxtRUFBbUU7UUFDbkUsWUFBWTtRQUNaLElBQUk7UUFDSixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxXQUFXLENBQUMsUUFBZ0I7UUFDOUIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7WUFDaEMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksZUFBZSxDQUFDLE1BQWM7UUFDaEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDdEMsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFXO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUVsQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1lBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXO1lBQ3RDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLDBDQUEwQztJQUNuRSxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsT0FBZTtRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksb0JBQW9CLENBQUMsT0FBZ0I7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFnQjtRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUF5QjtRQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxPQUF3QjtRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUEyQjtRQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsT0FBZTtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxRQUFhO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELGVBQWU7SUFFZixJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxLQUFvQjtRQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBaUlELGFBQWEsQ0FBQyxRQUF5QjtRQUNyQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQ3BDLFFBQVEsRUFDUixjQUFjLENBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBZ0I7UUFDdkIsSUFBSSxJQUFJLEVBQUU7WUFDUixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQ2IsSUFBSSxDQUFDLENBQUMsQ0FBVyxFQUFFLENBQVcsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDbkIsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDWDtxQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDMUIsT0FBTyxDQUFDLENBQUM7aUJBQ1Y7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLENBQUM7aUJBQ1Y7WUFDSCxDQUFDLENBQUM7aUJBQ0QsR0FBRyxDQUFDLENBQUMsR0FBYSxFQUFFLEVBQUU7Z0JBQ3JCLHVDQUNLLEdBQUcsS0FDTixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQ25EO1lBQ0osQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVTLFVBQVU7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNyQixNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQVU7WUFDekIsU0FBUyxFQUFFLEVBQUU7WUFDYixXQUFXLEVBQUUsQ0FBQztTQUNmLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVPLFFBQVE7O1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQ2hDLHFCQUFxQixDQUFDLHNCQUFzQixFQUM1QztZQUNFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FDN0IsQ0FBQztRQUNGLElBQ0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQ3pFO1lBQ0EsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsNERBQTREO1NBQ3RJO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUU3QixRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUU7WUFDNUMsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztpQkFDdkQ7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUMxQixxREFBcUQsQ0FDdEQsQ0FBQztpQkFDSDtnQkFDRCxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxRQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUEsRUFBRTtvQkFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2lCQUMxRDtnQkFDRCxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsT0FBTztnQkFDeEIsVUFBSSxJQUFJLENBQUMsVUFBVSwwQ0FBRSxRQUFRLEVBQUU7b0JBQzdCLElBQUksUUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLDBDQUFFLE9BQU8sQ0FBQSxFQUFFO3dCQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7cUJBQzFEO29CQUNELE1BQU07aUJBQ1A7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2lCQUMxRDtnQkFFRCxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsWUFBWTtnQkFDN0IsVUFBSSxJQUFJLENBQUMsVUFBVSwwQ0FBRSxRQUFRLEVBQUU7b0JBQzdCLElBQUksUUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLDBDQUFFLFdBQVcsQ0FBQSxFQUFFO3dCQUN0RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7cUJBQ2hFO29CQUNELE1BQU07aUJBQ1A7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2lCQUNoRTtnQkFFRCxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsU0FBUztnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztpQkFDdkQ7Z0JBQ0QsTUFBTTtTQUNUO1FBRUQsSUFDRSxJQUFJLENBQUMsYUFBYTtZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ3BEO1lBQ0EsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDL0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsSUFDRSxJQUFJLENBQUMsYUFBYTtZQUNsQixJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQzdDO1lBQ0EsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDMUIsOENBQThDLENBQy9DLENBQUM7U0FDSDtRQUVELHdCQUF3QjtRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFMUQsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDMUIsOEhBQThILENBQy9ILENBQUM7U0FDSDtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ3RCLGtCQUFrQjtZQUNsQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEYsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ3pCLEtBQUssQ0FDTixDQUNGLENBQUM7U0FDSDthQUFNO1lBQ0wsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWlDOztRQUNwRCxVQUFJLElBQUksQ0FBQyxRQUFRLDBDQUFFLElBQUksRUFBRTtZQUN2QixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3JDO1FBQ0QsT0FBTztZQUNMLFdBQVcsRUFBRSxXQUFXLENBQUMsS0FBSztZQUM5QixVQUFVLEVBQUUsS0FBSztZQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDdEMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxZQUEwQjtRQUNqRCxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUVwRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2pCLElBQUksRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVM7YUFDeEMsQ0FBQTtTQUNGO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQTBCLEVBQUUsRUFBRTtnQkFDekcsSUFBSSxPQUFPLEdBQUc7b0JBQ1osT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7cUJBQzdCO2lCQUNGLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsbUNBQVEsT0FBTyxHQUFLLElBQUksQ0FBQyxTQUFTLENBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQTtTQUNIO2FBQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDM0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRztnQkFDYixLQUFLLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2dCQUMxQyxLQUFLLEVBQUUsRUFBRTthQUNWLENBQUE7WUFDRCx1RUFBdUU7WUFDdkUsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtnQkFDekUsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxJQUFJLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRO29CQUN0QyxRQUFRLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRO29CQUMxQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTO2lCQUM3QyxDQUFBO2FBQ0Y7aUJBQU0sSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZCxJQUFJLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhO29CQUMzQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFFBQVE7aUJBQzdCLENBQUE7YUFDRjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDcEM7YUFBTSxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBOEIsRUFBRSxFQUFFO2dCQUMzRyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxJQUFJLE1BQU0sR0FBd0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQTJCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEksSUFBSSxDQUFDLE1BQU0sR0FBRzt3QkFDWixFQUFFLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRO3dCQUNwQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7cUJBQ2xCLENBQUE7b0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDcEM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFO1lBQ25ELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBMEIsRUFBRSxFQUFFO2dCQUMzRyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWdDLENBQUE7Z0JBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7WUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRztnQkFDYixLQUFLLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2dCQUMxQyxLQUFLLEVBQUUsRUFBRTthQUNWLENBQUE7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQVk7UUFDdkMsSUFBSSxJQUFJLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDeEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSLENBQUM7U0FDSDthQUFNO1lBQ0wsT0FBTyxFQUFFLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBNkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxVQUFVOztRQUNSLE1BQU0sS0FBSyxHQUErQjtZQUN4QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUM1RCxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMzRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWU7WUFDdkMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNwRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1lBQ2xDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztZQUM3QixVQUFVLEVBQUUsR0FBRztTQUNoQixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFCLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRTtZQUM1QyxLQUFLLGFBQWEsQ0FBQyxPQUFPO2dCQUN4QixLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3RELE1BQU07WUFFUixLQUFLLGFBQWEsQ0FBQyxJQUFJO2dCQUNyQixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN2Qyx1RUFBdUU7Z0JBQ3ZFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDakIsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztvQkFDeEMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztpQkFDM0M7cUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUN4QixLQUFLLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2lCQUMxQztnQkFDRCxNQUFNO1lBRVIsS0FBSyxhQUFhLENBQUMsWUFBWTtnQkFDN0IsS0FBSyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztnQkFDL0QsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRSwwQkFBMEI7Z0JBQ25ELEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sMENBQUUsRUFBRSxDQUFBLENBQUM7Z0JBQzNDLE1BQU07WUFFUixLQUFLLGFBQWEsQ0FBQyxTQUFTO2dCQUMxQixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxNQUFNO1NBRVQ7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7U0FDOUM7UUFFRCx1Q0FBdUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxTQUFTLFNBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLDBDQUFFLElBQUksQ0FBQztTQUNyRDtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxLQUF1QjtRQUM5QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDeEQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDdkQsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMvQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDO0lBQ0osQ0FBQztJQWlDTyxZQUFZLENBQUMsS0FBbUI7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFFLElBQUksWUFBWSxFQUFFO1lBQ2hCLE9BQU8sQ0FDTCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNwRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQ3JFLENBQUM7U0FDSDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGVBQWUsQ0FBQyxLQUFtQjtRQUN6QyxPQUFPLENBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FDMUUsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxLQUFtQjtRQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVyRCxPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQW1CO1FBQ2hELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRSxJQUFJLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1lBQzlCLElBQUksT0FBTyxHQUFXLENBQUMsQ0FBQztZQUN4QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDakMsWUFBWSxDQUFDLElBQUksRUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQ3hCLENBQUM7WUFDRixJQUFJLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxRQUFRLEVBQUU7Z0JBQzFCLE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxZQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsS0FBSyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ3RELENBQUMsQ0FDRixDQUFDO2FBQ0g7WUFDRCxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBSSxNQUFNLEdBQVksUUFBUSxJQUFJLFFBQVEsQ0FBQztZQUMzQyxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQW1CO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFVLEVBQUU7WUFDdkUsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTTtZQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRTtnQkFDakMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUM7WUFDRixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQW1CO1FBQzdDLElBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hHLElBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3BELE1BQU0sZ0JBQWdCLEdBQWdDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDeEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbEcsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFdEcsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDbEUsSUFBRyxtQkFBbUIsSUFBSSxtQkFBbUIsRUFBQztnQkFDNUMsT0FBTyxLQUFLLENBQUM7YUFDZDtpQkFBTSxJQUFHLG1CQUFtQixFQUFFO2dCQUM3QixPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQzVHO2lCQUFNLElBQUcsbUJBQW1CLEVBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDNUc7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNGLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUVILFdBQVcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ25DLG9CQUFvQjtRQUNwQixNQUFNLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVuRCxxQ0FBcUM7UUFDckMsTUFBTSxnQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sbUJBQW1CLEdBQXNCLEVBQUUsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7O1lBQ3pCLE9BQUEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQywwQ0FBRSxJQUFJLEVBQzlELENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQW1CLEVBQUUsTUFBb0IsRUFBRSxFQUFFOztZQUNsRSxNQUFNLFVBQVUsU0FDZCxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLDBDQUFFLElBQUksQ0FBQztZQUM3RCxNQUFNLFdBQVcsU0FDZixJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLDBDQUFFLElBQUksQ0FBQztZQUM5RCxPQUFPLEdBQUc7Z0JBQ1IsQ0FBQyxDQUFDLFVBQVUsR0FBRyxXQUFXO29CQUN4QixDQUFDLENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsV0FBVyxHQUFHLFVBQVU7d0JBQ3hCLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDLFVBQVUsR0FBRyxXQUFXO29CQUN4QixDQUFDLENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsV0FBVyxHQUFHLFVBQVU7d0JBQ3hCLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO1FBRUgsbURBQW1EO1FBQ25ELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLG1CQUFtQixDQUFDLENBQUM7UUFFbkUsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhDLHVFQUF1RTtRQUN2RSxJQUFJLEtBQUssRUFBRTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDakQ7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDckIsQ0FBQyxHQUFpQixFQUFFLEdBQWlCLEVBQVUsRUFBRTtZQUMvQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBZSxFQUFFLENBQWUsRUFBRSxFQUFFO1lBQzFELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFtQjtRQUN4QyxPQUFPLENBQ0wsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3ZELENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLFNBQXdCO1FBQzdDLE9BQU87WUFDTCx1Q0FBdUM7WUFDdkMsTUFBTSxFQUFFLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLEtBQUssc0JBQXNCO1lBQ3ZFLHVDQUF1QztZQUN2QyxRQUFRLEVBQUUsQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsS0FBSyxxQkFBcUI7U0FDeEUsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLElBQXdCO1FBQ2hELE1BQU0sSUFBSSxHQUFRLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQWMsRUFBRSxJQUF3QjtRQUNuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQy9CLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFjLEdBQUksSUFBSSxDQUFDLElBQUksQ0FBYyxDQUFDLE1BQU0sQ0FDeEQsQ0FBQyxLQUFhLEVBQUUsRUFBRTtnQkFDaEIsT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDO1lBQzFCLENBQUMsQ0FDRixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwwQkFBMEIsQ0FDeEIsYUFBOEM7O1FBRTlDLE1BQU0sVUFBVSxTQUNkLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLDBDQUFFLFdBQVcsQ0FBQztRQUNqRCxJQUFJLFVBQVUsRUFBRTtZQUNkLHNDQUFzQztTQUN2QztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsS0FBbUI7UUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUVoRCxtQ0FBbUM7UUFDbkMsSUFDRSxDQUFDLGdCQUFnQixDQUFDLE1BQU07WUFDeEIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFDNUM7WUFDQSxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsOEJBQThCO1FBQzlCLElBQ0UsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDL0MsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFDL0M7WUFDQSxPQUFPLENBQ0wsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLElBQUksQ0FDckUsQ0FBQztTQUNIO1FBRUQsU0FBUztRQUNULElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuRCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQztTQUMxQztRQUVELFNBQVM7UUFDVCxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbkQsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsUUFBZ0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELDJCQUEyQjtJQUNuQixjQUFjLENBQUMsS0FBbUI7UUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ25ELGFBQWEsQ0FBQyxZQUFZLENBQzNCLENBQUM7UUFDRixJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUM7U0FDbkM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDckQsYUFBYSxDQUFDLGVBQWUsQ0FDOUIsQ0FBQztRQUNGLElBQUksbUJBQW1CLEVBQUU7WUFDdkIsT0FBTyxDQUNMLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3hCLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtvQkFDWixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNuRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsYUFBYSxDQUFDLGVBQWUsQ0FDOUIsQ0FBQyxXQUFXLEVBQUUsQ0FDaEIsQ0FBQztpQkFDSDtxQkFBTTtvQkFDTCxPQUFPLElBQUksQ0FBQztpQkFDYjtZQUNILENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ2QsQ0FBQztTQUNIO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0NBQWdDO0lBQ3hCLGtCQUFrQixDQUFDLEtBQW1CO1FBQzVDLElBQUksTUFBTSxHQUFZLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxQyxJQUFJLGVBQWUsR0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNuRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQ1osSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDbkUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFO3dCQUNoRSxPQUFPLElBQUksQ0FBQztxQkFDYjtvQkFDRCxPQUFPLEtBQUssQ0FBQztpQkFDZDtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDdEUsK0VBQStFO1lBQy9FLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQVk7UUFDckMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsU0FBUyxDQUFDLFdBQW1CO1FBQzNCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVztZQUM1QixJQUFJLENBQUMsa0JBQWtCO1lBQ3ZCLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUMsQ0FBQywwRkFBMEY7UUFDeEksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUN4QztRQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN6RSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLE1BQU0sS0FBSyxDQUFDLGVBQWUsV0FBVyxxQkFBcUIsQ0FBQyxDQUFDO2FBQzlEO1lBQ0QsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUM1QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDaEUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDakMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ25CO2dCQUNELE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xCLE1BQU0sS0FBSyxDQUNULHFEQUFxRCxXQUFXLEVBQUUsQ0FDbkUsQ0FBQzthQUNIO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxXQUFtQjtRQUNuQyxNQUFNLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUNsQzthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsT0FBdUI7UUFDdkMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1FBRWQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5DLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRO1lBQy9ELFlBQVksRUFBRSxTQUFTO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksY0FBYyxHQUFVLEVBQUUsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUQsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDNUYsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxFQUFFLENBQUM7YUFDWCxDQUFDO1lBQ0YsY0FBYyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyQjtTQUNGO1FBRUQsOERBQThEO1FBQzlELGlFQUFpRTtRQUNqRSxzREFBc0Q7UUFDdEQsS0FBSztJQUNQLENBQUM7SUFHRDs7UUFFSTtJQUVILGlCQUFpQixDQUFDLFdBQW1CLEVBQUUsVUFBa0I7UUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLEdBQUcsaUJBQWlCLEdBQUcsV0FBVyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkgsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUMsV0FBVyxDQUFDLENBQUM7UUFFOUQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLEVBQUU7WUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQzdDLGFBQWEsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUM1QztRQUVELElBQUksYUFBYSxJQUFJLENBQUMsRUFBRTtZQUN0QixhQUFhLEdBQUcsQ0FBQyxDQUFDO1NBQ25CO1FBRUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUM7UUFDL0IsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVLLG9CQUFvQixDQUN4QixLQUF1QixFQUN2QixTQUFvQixFQUNwQixVQUFzQyxFQUN0QyxVQUF3Qjs7WUFFeEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO2dCQUNyQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0I7WUFDRCxxRUFBcUU7WUFDckUsVUFBVSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEUsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFaEUsMklBQTJJO1lBQzNJLE1BQU0sV0FBVyxxQkFBUSxVQUFVLENBQUUsQ0FBQztZQUN0QyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFFMUIsTUFBTSxTQUFTLEdBQ2IsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDOUMsTUFBTSxNQUFNLEdBQUcsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxLQUFLLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxTQUFTLENBQUM7Z0JBQ3pFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQ25DO29CQUNFLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtvQkFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUNqQixPQUFPLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7b0JBQ2xDLE1BQU0sRUFBRTt3QkFDTixPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVM7d0JBQzdCLFFBQVEsRUFBRSxVQUFVLENBQUMsT0FBTzt3QkFDNUIsWUFBWSxFQUFFOzRCQUNaLFVBQVUsRUFBRSxhQUFhLENBQUMsWUFBWTs0QkFDdEMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxZQUFZOzRCQUNoQyxNQUFNLEVBQUUsYUFBYSxDQUFDLFlBQVk7NEJBQ2xDLFFBQVEsRUFBRSxhQUFhLENBQUMsYUFBYTs0QkFDckMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxXQUFXO3lCQUN2Qzt3QkFDRCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsS0FBSzt3QkFDN0IsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJO3dCQUNyQixhQUFhLEVBQUUsVUFBVSxDQUFDLEtBQUs7d0JBQy9CLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixNQUFNO3dCQUNOLFFBQVE7cUJBQ1Q7b0JBQ0QsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO29CQUN0QixRQUFRLEVBQUUsU0FBUyxDQUFDLFlBQTRCO29CQUNoRCxXQUFXO29CQUNYLFlBQVksRUFBRSxVQUFVLENBQUMsU0FBUztpQkFDbkMsRUFDRCxTQUFTLEVBQ1QsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQzthQUNIO1lBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FBQTs7QUE5dkNlLHFDQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLDRDQUFzQixHQUFHLGNBQWMsQ0FBQztBQUN4Qyw2Q0FBdUIsR0FBRyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIG9mLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmFzZUVudmlyb25tZW50IH0gZnJvbSAnLi9lbnZpcm9tZW50JztcclxuaW1wb3J0IHsgQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaG90ZWwtYXZhbGxpYmlsaXR5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVUkxTIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy91cmwuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ291bnRyeSxcclxuICBIb3RlbFF1b3RlUmVzdWx0LFxyXG4gIEhvdGVsUXVvdGVSZXN1bHRBcnJheSxcclxuICBMb2NhdGlvblR5cGVzLFxyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgTG9jYXRpb25EZXRhaWxzLFxyXG4gIEhvdGVsQXZhbGliaWxpdHlRdW90ZVJlc3VsdCxcclxuICBpbmNsdWRlZEV4cHJlc3Npb24sXHJcbiAgZXhjbHVkZWRFeHByZXNzaW9uLFxyXG4gIFNlYXJjaEhhbmRsZXIsXHJcbiAgUmVjZW50U2VhcmNoLFxyXG4gIEFpcnBvcnRTZWFyY2hSZXN1bHRzXHJcbn0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ29uZmVybWFPZmZpY2VOYW1lcyxcclxuICBDdXJyZW5jeUNvZGUsXHJcbiAgRGlzdGFuY2VUeXBlcyxcclxuICBIb3RlbExvY2F0aW9uLFxyXG4gIEhvdGVsUm9vbSxcclxuICBIb3RlbFRhZyxcclxuICBSYWlsU3RhdGlvbixcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VydmljZVR5cGVcclxufSBmcm9tICcuLi90eXBlcy9ncmFwaHFsLnR5cGVzJztcclxuaW1wb3J0IHtcclxuICBCYXNlSG90ZWxRdW90ZUZldGNoZXIsXHJcbiAgSG90ZWxRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvaG90ZWwtcXVvdGUtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgRnVsbFVzZXJEZXRhaWxzLFxyXG4gIFVzZXJTZXJ2aWNlSW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lzZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaHR0cC1jYWxsLnNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IHsgSG90ZWxBdmFsaW5pbGl0eUZldGNoZXJUeXBlIH0gZnJvbSAnLi4vZmV0Y2hlcnMvaG90ZWwtYXZhbGlhYmlsaXR5LWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQXZhaWxhYmlsaXR5T2JqZWN0LFxyXG4gIERpc3BsYXlGaWx0ZXJTZXR0aW5ncyxcclxuICBIb3RlbERldGFpbHMsXHJcbiAgSG90ZWxEZXRhaWxzQXJyYXksXHJcbiAgSG90ZWxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlLFxyXG4gIEhvdGVsRmlsdGVycyxcclxuICBIb3RlbFRlbXBQYXJhbXMsXHJcbiAgSG90ZWxWaWV3LFxyXG4gIFJlc3VsdERldGFpbHNcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lob3RlbC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IElDaGVhcGVzdFByaWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVhcGVzdC1wcmljZSc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgQmFzZVNlYXJjaENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlciwgQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyVHlwZSB9IGZyb20gJy4uL2ZldGNoZXJzL2NvbmZlcm1hLXF1aWNrbGlzdC5mZXRjaGVyJztcclxuaW1wb3J0IHsgQmFzZUdldFJhaWxTdGF0aW9uRmV0Y2hlciwgR2V0UmFpbFN0YXRpb25GZXRjaGVyVHlwZSB9IGZyb20gJy4uL2ZldGNoZXJzL2dldC1yYWlsLXN0YXRpb24uZmV0Y2hlcic7XHJcblxyXG5leHBvcnQgZW51bSBTb3J0VHlwZXNIb3RlbCB7XHJcbiAgZGlzdGFuY2UgPSAnZGlzdGFuY2UnLFxyXG4gIG5hbWUgPSAnbmFtZScsXHJcbiAgcHJpY2UgPSAncHJpY2UnXHJcbn1cclxuXHJcbmNvbnN0IENMSUVOVF9QUkVGRVJSRURfVkFMVUUgPSAxO1xyXG5jb25zdCBBR0VOVF9QUkVGRVJSRURfVkFMVUUgPSAyO1xyXG5cclxuZXhwb3J0IGNsYXNzIEhvdGVsRW50ZXJwcmlzZVNlYXJjaDxcclxuICBIUV9RIGV4dGVuZHMgSG90ZWxRdW90ZUZldGNoZXJUeXBlLFxyXG4gIEhBX1EgZXh0ZW5kcyBIb3RlbEF2YWxpbmlsaXR5RmV0Y2hlclR5cGUsXHJcbiAgUUxfUSBleHRlbmRzIENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlclR5cGUsXHJcbiAgR1JTX1EgZXh0ZW5kcyBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgSG90ZWxUZW1wUGFyYW1zLFxyXG4gIEhvdGVsUXVvdGVSZXN1bHRBcnJheSxcclxuICBIb3RlbERldGFpbHNBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9IT1RFTF9ST09NUyA9IDQ7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX2hvdGVsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAncmVzdWx0c19ob3RlbCc7XHJcblxyXG4gIHB1YmxpYyB0eXBlOiBTZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlLkhvdGVsO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcbiAgcHVibGljIGxvY2F0aW9uX3R5cGVzOiBCZWhhdmlvclN1YmplY3Q8TG9jYXRpb25UeXBlc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBMb2NhdGlvblR5cGVzW11cclxuICA+KFtdKTtcclxuICBwdWJsaWMgb2ZmaWNlczogQmVoYXZpb3JTdWJqZWN0PExvY2F0aW9uVHlwZXNbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgTG9jYXRpb25UeXBlc1tdXHJcbiAgPihbXSk7XHJcbiAgcHVibGljIGxhc3RBY3RpdmVQYWdlOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XHJcblxyXG4gIHJlYWRvbmx5IGdhbGxlcmllczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgcHJpdmF0ZSBvY2N1cGllZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHJlc3VsdHNfZGV0YWlsczogUmVzdWx0RGV0YWlscyA9IHtcclxuICAgIGNoYWluczogbmV3IFNldDxzdHJpbmc+KCksXHJcbiAgICBhbWVuaXRpZXM6IFtdLFxyXG4gICAgbWF4RGlzdGFuY2U6IDBcclxuICB9O1xyXG4gIHByaXZhdGUgX2NoZWNraW5fZGF0ZV9uZ2I6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHJpdmF0ZSBfY2hlY2tvdXRfZGF0ZV9uZ2I6IE5nYkRhdGVTdHJ1Y3Q7XHJcblxyXG4gIGdldCBjaGFpbnMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnNdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFtZW5pdGllcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMucmVzdWx0c19kZXRhaWxzLmFtZW5pdGllc107XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4RGlzdGFuY2UoKTogbnVtYmVyIHtcclxuICAgIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heCA9IE1hdGguY2VpbChcclxuICAgICAgTWF0aC5tYXguYXBwbHkoXHJcbiAgICAgICAgTWF0aCxcclxuICAgICAgICB0aGlzLnJlc3VsdHMudmFsdWUubWFwKChvKSA9PiBvLmxvY2F0aW9uLmRpc3RhbmNlKVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UgPSB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXg7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2U7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4UHJpY2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UubWF4KTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeTtcclxuICB9XHJcblxyXG4gIHNldCBjdXJyZW5jeSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3kgPSB2YWx1ZTtcclxuICB9XHJcbiAgLy8gRXZlbnQgRW1pdHRlcnNcclxuICBwdWJsaWMgZmlsdGVyQ2hhbmdlOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIHB1YmxpYyBzZWxlY3RJdGVtTWFwVmlldzogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGRpc3BsYXk6IERpc3BsYXlGaWx0ZXJTZXR0aW5ncyA9IHtcclxuICAgIG1pbnByaWNlOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXHJcbiAgICBtYXhwcmljZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgZmlsdGVyczoge1xyXG4gICAgICBicmVha2Zhc3RUeXBlOiBbXVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIHB1YmxpYyB2YXJpYWJsZXNcclxuICBwdWJsaWMgbWluX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtaW5fcmV0dXJuX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKSArIDEgLy8gbWluIDEgbmlnaHQgc3RheVxyXG4gIH07XHJcblxyXG4gIC8vIHByaXZhdGUgdmFyaWFibGVzXHJcbiAgLy8gZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aW1lcyBoZXJlIC0gbWF5YmUgbm9ybWFsaXNlIHRoZXNlIGluIHRoZSByZXF1ZXN0IGJvZHk/XHJcblxyXG4gIHByaXZhdGUgbG9jYWxGaWx0ZXJzID0gbmV3IEhvdGVsRmlsdGVycygpO1xyXG5cclxuICBwdWJsaWMgY3VycmVudFZpZXc6IEhvdGVsVmlldyA9IEhvdGVsVmlldy5MSVNUO1xyXG5cclxuICAvLyBGb3IgTmdGb3Jpbmcgb3ZlciBpbiB0aGUgdGVtcGxhdGVzXHJcbiAgcHJpdmF0ZSBfbWF4X25vX29mX3Jvb21zID0gNDtcclxuICBwcml2YXRlIF9tYXhfcm9vbXNfYXJyYXkgPSBuZXcgQXJyYXkodGhpcy5fbWF4X25vX29mX3Jvb21zKS5maWxsKDApO1xyXG4gIHByaXZhdGUgX21heF9ub19vZl9vY2N1cGFudHMgPSAyO1xyXG4gIHByaXZhdGUgX21heF9vY2N1cGFudF9hcnJheSA9IG5ldyBBcnJheSh0aGlzLl9tYXhfbm9fb2Zfb2NjdXBhbnRzKS5maWxsKDApO1xyXG4gIHByaXZhdGUgX2Rpc3RhbmNlX2xpc3QgPSBbMSwgMiwgNSwgMTAsIDIwLCAyNV07IC8vIGNvcGllZCBmcm9tIG9sZCBmcm9udGVuZCBmb3Igbm93XHJcbiAgcHJpdmF0ZSBfZGVmYXVsdF9jdXJyZW5jeTogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8gZ2V0dGVycyBhbmQgc2V0dGVyc1xyXG5cclxuICBnZXQgY2hlY2tpbl9kYXRlX25nYigpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVja2luX2RhdGVfbmdiO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNraW5fZGF0ZV9uZ2IodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2NoZWNraW5fZGF0ZV9uZ2IgPSB2YWx1ZTtcclxuXHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHZhbHVlKTtcclxuICAgIHRoaXMuY2hlY2tpbl9kYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGVja291dF9kYXRlX25nYigpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVja291dF9kYXRlX25nYjtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja291dF9kYXRlX25nYih2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fY2hlY2tvdXRfZGF0ZV9uZ2IgPSB2YWx1ZTtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHZhbHVlKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGVja2luX2RhdGUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja2luX2RhdGUobmV3RGF0ZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgaWYgKG5ld0RhdGUgJiYgbmV3RGF0ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZSA9IG1vbWVudChuZXdEYXRlKTtcclxuICAgICAgdGhpcy5fY2hlY2tpbl9kYXRlX25nYiA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlKTtcclxuICAgICAgaWYgKG5ld0RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KG5ld0RhdGUpLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNrb3V0X2RhdGUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tvdXRfZGF0ZShuZXdEYXRlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICAvLyBpZiAobmV3RGF0ZS5pc1NhbWVPckJlZm9yZSh0aGlzLmNoZWNraW5fZGF0ZSkpIHsgIC8vIG5vdCBhbGxvd2VkXHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuICAgIGlmIChuZXdEYXRlICYmIG5ld0RhdGUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlID0gbmV3RGF0ZTtcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlX25nYiA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlKTtcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG5vX29mX3Jvb21zKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm5vX29mX3Jvb21zO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vX29mX3Jvb21zKG5ld1Jvb21zOiBudW1iZXIpIHtcclxuICAgIGlmIChuZXdSb29tcyA+IDQgfHwgbmV3Um9vbXMgPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMgPSBuZXdSb29tcztcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBub19vZl9vY2N1cGFudHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vX29mX29jY3VwYW50cyhuZXdPY2M6IG51bWJlcikge1xyXG4gICAgaWYgKG5ld09jYyA8IDEgfHwgbmV3T2NjID4gMykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyA9IG5ld09jYztcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBkZWZhdWx0X2N1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGRlZmF1bHRfY3VycmVuY3koY3VycmVuY3k6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5ID0gY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICAvLyBtYXkgaGF2ZSB0byBtb2RpZnkgdGhlc2VcclxuICBnZXQgbG9jYXRpb24oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb24obmV3TG9jOiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbiA9IG5ld0xvYztcclxuXHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybWF0dGVkX2xvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uXHJcbiAgICAgID8gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uLmRlc3RpbmF0aW9uXHJcbiAgICAgIDogJ05vIExvY2F0aW9uIFNldCc7IC8vIFRPRE8gLSAgZXhwYW5kIHRoaXMgZm9yIGRpZmZlcmVudCB0eXBlc1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3RhbmNlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3RhbmNlKG5ld0Rpc3Q6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlID0gbmV3RGlzdDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBwcmVmZXJlZF9ob3RlbHNfb25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVyZWRfaG90ZWxzX29ubHk7XHJcbiAgfVxyXG5cclxuICBzZXQgcHJlZmVyZWRfaG90ZWxzX29ubHkobmV3UHJlZjogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcmVkX2hvdGVsc19vbmx5ID0gbmV3UHJlZjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjb3VudHJ5KCk6IENvdW50cnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jb3VudHJ5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGNvdW50cnkobmV3Q29udDogQ291bnRyeSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNvdW50cnkgPSBuZXdDb250O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc3Rjb2RlKCk6IExvY2F0aW9uRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnBvc3Rjb2RlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBvc3Rjb2RlKHBvc3Rjb2RlOiBMb2NhdGlvbkRldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wb3N0Y29kZSA9IHBvc3Rjb2RlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyYWluc1N0YXRpb24oKTogTG9jYXRpb25EZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCB0cmFpbnNTdGF0aW9uKHN0YXRpb246IExvY2F0aW9uRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnRyYWluc1N0YXRpb24gPSBzdGF0aW9uO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9mZmljZSgpOiBDb25mZXJtYU9mZmljZU5hbWVzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub2ZmaWNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IG9mZmljZShvZmZpY2U6IENvbmZlcm1hT2ZmaWNlTmFtZXMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vZmZpY2UgPSBvZmZpY2U7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGRpdGlvbmFsIFZhcmlhYmxlc1xyXG4gIGdldCBob3RlbF9uYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmhvdGVsX25hbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgaG90ZWxfbmFtZShuZXdOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9uYW1lID0gbmV3TmFtZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBob3RlbF9jaGFpbigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9jaGFpbjtcclxuICB9XHJcblxyXG4gIHNldCBob3RlbF9jaGFpbihuZXdDaGFpbjogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfY2hhaW4gPSBuZXdDaGFpbjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlcnMgT25seVxyXG5cclxuICBnZXQgbWF4X3Jvb21zX2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfcm9vbXNfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4X29jY3VwYW50X2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfb2NjdXBhbnRfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzdGFuY2VfbGlzdCgpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzdGFuY2VfbGlzdDtcclxuICB9XHJcblxyXG4gIGdldCBsb2NhdGlvbl90eXBlX3NlbGVjdCgpOiBMb2NhdGlvblR5cGVzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb25fdHlwZV9zZWxlY3QodmFsdWU6IExvY2F0aW9uVHlwZXMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcnMoKTogSG90ZWxGaWx0ZXJzIHtcclxuICAgIHJldHVybiB0aGlzLmxvY2FsRmlsdGVycztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBob3RlbEZldGNoZXI6IEJhc2VIb3RlbFF1b3RlRmV0Y2hlcjxIUV9RPixcclxuICAgIHByaXZhdGUgaGVscGVyczogQmFzZUhlbHBlclJvdXRpbmVzLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIGVudmlyb25tZW50OiBCYXNlRW52aXJvbm1lbnQsXHJcbiAgICBwcml2YXRlIGF2YWxpYWJpbGl0eVNlcnZpY2U6IEJhc2VIb3RlbEF2YWxpYmlsaXR5U2VydmljZTxIQV9RPixcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBzdG9yYWdlU2VydmljZTogQmFzZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgaHR0cENhbGxTZXJ2aWNlOiBBYnN0cmFjdEh0dHBDYWxsU2VydmljZSxcclxuICAgIHByaXZhdGUgcXVpY2tMaXN0RmV0Y2hlcjogQmFzZVNlYXJjaENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlcjxRTF9RPixcclxuICAgIHByaXZhdGUgZ2V0UmFpbFN0YXRpb25GZXRjaGVyOiBCYXNlR2V0UmFpbFN0YXRpb25GZXRjaGVyPEdSU19RPlxyXG4gICkge1xyXG4gICAgc3VwZXIoc3RvcmFnZVNlcnZpY2UsIChyZXN1bHRzVG9NYXA6IEhvdGVsUXVvdGVSZXN1bHRBcnJheSkgPT4ge1xyXG4gICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IDA7XHJcbiAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0c1RvTWFwLm1hcChcclxuICAgICAgICAoaG90ZWxSZXN1bHQ6IEhvdGVsUXVvdGVSZXN1bHQsIGluZGV4OiBudW1iZXIpOiBIb3RlbERldGFpbHMgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UgPSBNYXRoLm1heChcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UsXHJcbiAgICAgICAgICAgIGhvdGVsUmVzdWx0LmxvY2F0aW9uLmRpc3RhbmNlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID0gdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2U7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnMuYWRkKGhvdGVsUmVzdWx0Lmdyb3VwKTtcclxuICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuZW52aXJvbm1lbnQubnVtYmVySG90ZWxUb1ByZWxvYWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eUZvcklkKFxyXG4gICAgICAgICAgICAgIHRoaXMubWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsUmVzdWx0KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gdGhpcy5nZXRIb3RlbEF2YWlsYWJpbGl0eShob3RlbFJlc3VsdCk7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzb3J0ZWRUYWdzOiB0aGlzLnNvcnRUYWdzKGhvdGVsUmVzdWx0LnRhZ3MpLFxyXG4gICAgICAgICAgICBEZXRhaWxzOiB7XHJcbiAgICAgICAgICAgICAgZGlzdGFuY2VfYWlycG9ydDogMCxcclxuICAgICAgICAgICAgICBkaXN0YW5jZV9tZXRybzogMCxcclxuICAgICAgICAgICAgICBkaXN0YW5jZV9yYWlsOiAwLFxyXG4gICAgICAgICAgICAgIGFpcnBvcnRfZGV0YWlsczogeyBuYW1lOiAnTm90IHJldHVybmVkJyB9LFxyXG4gICAgICAgICAgICAgIG1ldHJvX2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfSxcclxuICAgICAgICAgICAgICByYWlsX2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAvLyBhdmlsYWJpbGl0eTogdGhpcy5ob3RlbF9hdmFpbGFiaWxpdHksXHJcbiAgICAgICAgICAgIC4uLmhvdGVsUmVzdWx0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEhvdGVsVGVtcFBhcmFtcztcclxuICAgIH0gPSBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShcclxuICAgICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVNcclxuICAgICkgfHwge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHt9IGFzIEhvdGVsVGVtcFBhcmFtc1xyXG4gICAgICB9O1xyXG5cclxuICAgIHRoaXMuZGVmYXVsdF9jdXJyZW5jeSA9IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA/IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA6IHRoaXMuX2RlZmF1bHRfY3VycmVuY3k7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeShkYXRhLnRlbXBQYXJhbXMpKTtcclxuXHJcbiAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKSkge1xyXG4gICAgICBzZWFyY2hTZXJ2aWNlLnRyYXZlbGxlckluZm9ybWF0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAodHJhdmVsbGVyczogVHJhdmVsbGVyW10pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5Ib3RlbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMgPSBzcGxpdFRyYXZlbGxlcnMuYWR1bHRzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxIb3RlbERldGFpbHNBcnJheT4oXHJcbiAgICAgICAgdGhpcy5yZXN1bHRzU2Vzc2lvbk5hbWVcclxuICAgICAgKSB8fCBbXTtcclxuICAgIHJlc3VsdHNcclxuICAgICAgLnNsaWNlKDAsIHRoaXMuZW52aXJvbm1lbnQubnVtYmVySG90ZWxUb1ByZWxvYWQpXHJcbiAgICAgIC5mb3JFYWNoKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eUZvcklkKFxyXG4gICAgICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWwpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChob3RlbFJlc3VsdDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucy5hZGQoaG90ZWxSZXN1bHQuZ3JvdXApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZ1bGxSZXN1bHRzID0gcmVzdWx0cztcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG5cclxuICAgIHRoaXMudXNlclNlcnZpY2UuY2hhbmdlVXNlci5zdWJzY3JpYmUoKHVzZXI6IFBhcnRpYWw8RnVsbFVzZXJEZXRhaWxzPikgPT4ge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVzLm5leHQoW1xyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuQWlycG9ydCxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLkNpdHksXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5PZmZpY2UsXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3QsXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb25cclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChzZWFyY2hTZXJ2aWNlLnNob3VsZEZldGNoQWxsT2ZmaWNlcygpKSB7XHJcbiAgICAgICAgdGhpcy5vZmZpY2VzLm5leHQoW10pOyAvLyBUT0RPIGZldGNoIG9mZmljZXNcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcblxyXG4gICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmZldGNoaW5nLnN1YnNjcmliZSgoaXNGZXRjaGluZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAoIWlzRmV0Y2hpbmcpIHtcclxuICAgICAgICAvLyBXZSd2ZSBqdXN0IGZpbmlzaGVkIGZldGNoaW5nIGF2YWxpYmlsaXR5IHNvIHVwZGF0ZSBmaWx0ZXJzLlxyXG5cclxuICAgICAgICBjb25zdCBtYXhOdW1iZXIgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UubWF4UHJpY2VGb3JDdXJyZW5jeSgnR0JQJyk7XHJcbiAgICAgICAgaWYgKG1heE51bWJlciA+IDApIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlLm1heCA9IG1heE51bWJlcjtcclxuICAgICAgICAgIHRoaXMubG9jYWxGaWx0ZXJzLnByaWNlUmFuZ2UubWF4ID0gbWF4TnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGVhcGVzdFJlc3VsdFByaWNlID0gdGhpcy51cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVzdWx0c1Nlc3Npb25OYW1lID0gSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBwcml2YXRlIHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyA9IHt9IGFzIFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzO1xyXG5cclxuICBtYWtlTG9jYXRpb25zKGxvY2F0aW9uOiBIb3RlbExvY2F0aW9uW10pOiB7IFtrZXk6IHN0cmluZ106IEhvdGVsTG9jYXRpb25bXSB9IHtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMuYXJyYXlUb09iamVjdEFycmF5PEhvdGVsTG9jYXRpb24+KFxyXG4gICAgICBsb2NhdGlvbixcclxuICAgICAgJ2Rpc3RhbmNlVHlwZSdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzb3J0VGFncyh0YWdzOiBIb3RlbFRhZ1tdKTogYW55W10ge1xyXG4gICAgaWYgKHRhZ3MpIHtcclxuICAgICAgcmV0dXJuIFsuLi50YWdzXVxyXG4gICAgICAgIC5zb3J0KChhOiBIb3RlbFRhZywgYjogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIGlmIChhLm5hbWUgPCBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLm5hbWUgPiBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5tYXAoKHRhZzogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnRhZyxcclxuICAgICAgICAgICAgaWNvbjogdGhpcy5lbnZpcm9ubWVudC50YWdNYXBbdGFnLm5hbWVdIHx8IHRhZy5pY29uXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0UXVlcnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VIb3RlbFF1ZXJ5KCkpO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscyA9IHtcclxuICAgICAgY2hhaW5zOiBuZXcgU2V0PHN0cmluZz4oKSxcclxuICAgICAgYW1lbml0aWVzOiBbXSxcclxuICAgICAgbWF4RGlzdGFuY2U6IDBcclxuICAgIH07XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgaWYgKCF0aGlzLmRvQ2hlY2tzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubWluX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlXHJcbiAgICApO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlLmlzU2FtZU9yQWZ0ZXIodGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUpLmFkZCgxLCAnZGF5Jyk7IC8vIGVuc3VyZSB0aGF0IGNoZWNrb3V0IGRhdGUgaXMgbWluIDEgZGF5IGFmdGVyIGNoZWNraW4gZGF0ZVxyXG4gICAgfVxyXG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQ2l0eTpcclxuICAgICAgICBpZiAoIXRoaXMuY291bnRyeSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIHNlbGVjdCBjb3VudHJ5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5sb2NhdGlvbiAmJiAhdGhpcy5wb3N0Y29kZSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAgICAgJ1BsZWFzZSBzZWxlY3QgYSBob3RlbCBsb2NhdGlvbiBvciBlbnRlciBhIHBvc3Rjb2RlLidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICBpZiAoIXRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbj8ub2ZmaWNlKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGFuIG9mZmljZS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBpZiAodGhpcy50ZW1wUGFyYW1zPy5sb2NhdGlvbikge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24uYWlycG9ydD8uZ2F0ZXdheSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIGlmICh0aGlzLnRlbXBQYXJhbXM/LmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbi5yYWlsc3RhdGlvbj8uc3RhdGlvbkNvZGUpIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIHNlbGVjdCBhIHRyYWluIHN0YXRpb24uJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIHNlbGVjdCBhIHRyYWluIHN0YXRpb24uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy5jaGVja2luX2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tvdXQgZGF0ZSBtdXN0IGJlIGFmdGVyIGNoZWNraW4gZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNrb3V0X2RhdGUgJiYgdGhpcy5jaGVja291dF9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja291dCBkYXRlIG11c3Qgbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hlY2tpbl9kYXRlICYmIHRoaXMuY2hlY2tpbl9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja2luIGRhdGUgbXVzdCBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZS5pc0FmdGVyKHRoaXMuY2hlY2tvdXRfZGF0ZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdDaGVja291dCBkYXRhIG11c3QgYmUgYWZ0ZXIgdGhlIGNoZWNraW4gZGF0ZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjdWxhdGluZyBPY2N1cGFuY3lcclxuICAgIGNvbnN0IG9jY3VwYW5jeSA9IHRoaXMubm9fb2Zfb2NjdXBhbnRzIC8gdGhpcy5ub19vZl9yb29tcztcclxuXHJcbiAgICBpZiAoIShvY2N1cGFuY3kgPT09IDEgfHwgb2NjdXBhbmN5ID09PSAyKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdPY2N1cGFudHMgcGVyIHJvb20gbXVzdCBiZSAxIG9yIDIsIGlmIHlvdSBoYXZlIGFuIG9kZCBudW1iZXIgb2YgdHJhdmVsbGVycyAoZ3JlYXRlciB0aGFuIG9uZSksIHRoZSBubyBvZiByb29tcyBtdXN0IGJlIGVxdWFsJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIHRoaXMuaXNWYWxpZC5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VzLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2goKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChbXSk7XHJcbiAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UucmVzZXQoKTtcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgLy8gYnVpbGQgdGhlIHF1ZXJ5XHJcbiAgICAgIHRoaXMuYnVpbGRRdWVyeSgpO1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0U2VhcmNoUXVlcnkoKTtcclxuICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVSZWNlbnRTZWFyY2godGhpcy5nZXRSZWNlbnRTZWFyY2hRdWVyeSh0aGlzLmdldFNlYXJjaFF1ZXJ5KCkpKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0U2VhcmNoKFxyXG4gICAgICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9PT0gTG9jYXRpb25UeXBlcy5TaG9ydGxpc3QgP1xyXG4gICAgICAgIHRoaXMucXVpY2tMaXN0RmV0Y2hlci5mZXRjaExpc3Qoe2NvdW50cnlDb2RlOiB0aGlzLmNvdW50cnkuY0NvZGV9KSA6XHJcbiAgICAgICAgdGhpcy5ob3RlbEZldGNoZXIuZmV0Y2hMaXN0KFxyXG4gICAgICAgICAgcXVlcnlcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyk6IFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyB7XHJcbiAgICBpZiAodGhpcy5sb2NhdGlvbj8ubmFtZSkge1xyXG4gICAgICBxdWVyeS5jaXR5TmFtZSA9IHRoaXMubG9jYXRpb24ubmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgc2VhcmNoQXJnczogcXVlcnksXHJcbiAgICAgIHRyYXZlbERhdGU6IHRoaXMuY2hlY2tpbl9kYXRlLmZvcm1hdCgpLFxyXG4gICAgICB0cmF2ZWxsZXJzOiB0aGlzLmhlbHBlcnMuZ2V0VHJhdmVsbGVyc0lkKHRoaXMudHJhdmVsbGVycylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRSZWNlbnRTZWFyY2gocmVjZW50U2VhcmNoOiBSZWNlbnRTZWFyY2gpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVuY3kgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jdXJyZW5jeTtcclxuICAgIHRoaXMuZGlzdGFuY2UgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5kaXN0YW5jZTtcclxuICAgIHRoaXMubm9fb2Zfcm9vbXMgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yb29tcztcclxuICAgIHRoaXMuY2hlY2tpbl9kYXRlID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnN0YXJ0RGF0ZSk7XHJcbiAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPSBtb21lbnQocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZW5kRGF0ZSk7XHJcbiAgICB0aGlzLmhvdGVsX25hbWUgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ob3RlbE5hbWU7XHJcblxyXG4gICAgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmdyb3VwTmFtZSkge1xyXG4gICAgICB0aGlzLmhvdGVsX2NoYWluID0ge1xyXG4gICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmdyb3VwTmFtZVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0XHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuaWF0YSkge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5BaXJwb3J0O1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2UuZ2V0QWlycG9ydEJ5Q29kZShyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5pYXRhKS5zdWJzY3JpYmUoKGlhdGE6IEFpcnBvcnRTZWFyY2hSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgbGV0IGFpcnBvcnQgPSB7XHJcbiAgICAgICAgICBhaXJwb3J0OiB7XHJcbiAgICAgICAgICAgIGdhdGV3YXk6IGlhdGEuaWF0YU1hdGNoLmlhdGFcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHsgLi4uYWlycG9ydCwgLi4uaWF0YS5pYXRhTWF0Y2ggfTtcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIGlmICgocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubGF0aXR1ZGUgJiYgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9uZ2l0dWRlKSB8fCByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5wb3N0T3JaaXBDb2RlKSB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLkNpdHk7XHJcbiAgICAgIHRoaXMuY291bnRyeSA9IHtcclxuICAgICAgICBjQ29kZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY291bnRyeUNvZGUsXHJcbiAgICAgICAgY05hbWU6ICcnIFxyXG4gICAgICB9XHJcbiAgICAgIC8vIHNob3VsZCBiZSBvbmUgc2VhcmNoIG1ldG9kIGZvciB0aGUgY2l0eSBzZWFyY2g6IGxvY2F0aW9uIG9yIHBvc3Rjb2RlXHJcbiAgICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sYXRpdHVkZSAmJiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sb25naXR1ZGUpIHtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgbmFtZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY2l0eU5hbWUsXHJcbiAgICAgICAgICBsYXRpdHVkZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubGF0aXR1ZGUsXHJcbiAgICAgICAgICBsb25naXR1ZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxvbmdpdHVkZVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5wb3N0T3JaaXBDb2RlKSB7XHJcbiAgICAgICAgdGhpcy5wb3N0Y29kZSA9IHtcclxuICAgICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnBvc3RPclppcENvZGUsXHJcbiAgICAgICAgICB0eXBlOiBMb2NhdGlvblR5cGVzLlBvc3Rjb2RlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICB9IGVsc2UgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm9mZmljZUlkKSB7IFxyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5PZmZpY2U7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5nZXRPZmZpY2VOYW1lcyh0aGlzLmlzTG9hZGluZykucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKG9mZmljZXM6IENvbmZlcm1hT2ZmaWNlTmFtZXNbXSkgPT4geyBcclxuICAgICAgICBpZiAob2ZmaWNlcykge1xyXG4gICAgICAgICAgbGV0IG9mZmljZTogQ29uZmVybWFPZmZpY2VOYW1lcyA9IG9mZmljZXMuZmluZCgob2ZmaWNlOiBDb25mZXJtYU9mZmljZU5hbWVzKSA9PiBvZmZpY2UuaWQgPT09IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm9mZmljZUlkKTtcclxuICAgICAgICAgIHRoaXMub2ZmaWNlID0ge1xyXG4gICAgICAgICAgICBpZDogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub2ZmaWNlSWQsXHJcbiAgICAgICAgICAgIG5hbWU6IG9mZmljZS5uYW1lXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYWluU3RhdGlvbkNvZGUpIHtcclxuICAgICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uO1xyXG4gICAgICB0aGlzLmdldFJhaWxTdGF0aW9uQnlDb2RlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYWluU3RhdGlvbkNvZGUpLnN1YnNjcmliZSgodHJhaW5zU3RhdGlvbjogUmFpbFN0YXRpb24pID0+IHtcclxuICAgICAgICB0aGlzLnRyYWluc1N0YXRpb24gPSB0cmFpbnNTdGF0aW9uIGFzIExvY2F0aW9uRGV0YWlsc1xyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0O1xyXG4gICAgICB0aGlzLmNvdW50cnkgPSB7XHJcbiAgICAgICAgY0NvZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNvdW50cnlDb2RlLFxyXG4gICAgICAgIGNOYW1lOiAnJyBcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSYWlsU3RhdGlvbkJ5Q29kZShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJhaWxTdGF0aW9uPiB7XHJcbiAgICBpZiAoY29kZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRSYWlsU3RhdGlvbkZldGNoZXIuZmV0Y2hMaXN0KHsgaWQ6IG51bGwsIGNvZGU6IGNvZGUgfSkucGlwZShcclxuICAgICAgICB0YWtlKDEpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFF1ZXJ5KCk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzIHtcclxuICAgIHRoaXMuYnVpbGRRdWVyeSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5yZW1vdmVOdWxsczxTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcz4odGhpcy5xdWVyeSk7XHJcbiAgfVxyXG5cclxuICBidWlsZFF1ZXJ5KCk6IHZvaWQge1xyXG4gICAgY29uc3QgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzID0ge1xyXG4gICAgICBzdGFydERhdGU6IHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIGVuZERhdGU6IHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxyXG4gICAgICByb29tczogdGhpcy50ZW1wUGFyYW1zLm5vX29mX3Jvb21zLFxyXG4gICAgICBhZHVsdHM6IHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMsXHJcbiAgICAgIGN1cnJlbmN5OiB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3kgPyB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3kgOiBudWxsLFxyXG4gICAgICBkaXN0YW5jZTogdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlLFxyXG4gICAgICBkaXN0YW5jZVR5cGU6IERpc3RhbmNlVHlwZXMuTSxcclxuICAgICAgbWF4UmVzdWx0czogMTAwXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0Um9vbU51bWJlcigpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5sb2NhdGlvbilcclxuICAgIHN3aXRjaCAodGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0KSB7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIHF1ZXJ5LmlhdGEgPSB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24uYWlycG9ydC5nYXRld2F5O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSB0aGlzLmNvdW50cnkuY0NvZGU7XHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIG9uZSBzZWFyY2ggbWV0b2QgZm9yIHRoZSBjaXR5IHNlYXJjaDogbG9jYXRpb24gb3IgcG9zdGNvZGVcclxuICAgICAgICBpZiAodGhpcy5sb2NhdGlvbikge1xyXG4gICAgICAgICAgcXVlcnkubGF0aXR1ZGUgPSB0aGlzLmxvY2F0aW9uLmxhdGl0dWRlO1xyXG4gICAgICAgICAgcXVlcnkubG9uZ2l0dWRlID0gdGhpcy5sb2NhdGlvbi5sb25naXR1ZGU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvc3Rjb2RlKSB7XHJcbiAgICAgICAgICBxdWVyeS5wb3N0T3JaaXBDb2RlID0gdGhpcy5wb3N0Y29kZS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjpcclxuICAgICAgICBxdWVyeS50cmFpblN0YXRpb25Db2RlID0gdGhpcy5sb2NhdGlvbi5yYWlsc3RhdGlvbi5zdGF0aW9uQ29kZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6IC8vIE5lZWRzIHRvIGZpeCBpbiBuZXh0IFBSXHJcbiAgICAgICAgcXVlcnkub2ZmaWNlSWQgPSArdGhpcy5sb2NhdGlvbi5vZmZpY2U/LmlkO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdDogXHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSB0aGlzLmNvdW50cnkuY0NvZGU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBob3RlbCBuYW1lIGluIHRoZSBxdWVyeVxyXG4gICAgaWYgKHRoaXMuaG90ZWxfbmFtZSkge1xyXG4gICAgICBxdWVyeS5ob3RlbE5hbWUgPSB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhZGQgY2hhaW4gb3IgZ3JvdXAgbmFtZSBpbnQgaGUgcXVlcnlcclxuICAgIGlmICh0aGlzLmhvdGVsX2NoYWluKSB7XHJcbiAgICAgIHF1ZXJ5Lmdyb3VwTmFtZSA9IHRoaXMudGVtcFBhcmFtcy5ob3RlbF9jaGFpbj8ubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XHJcbiAgfVxyXG5cclxuICBtYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWw6IEhvdGVsUXVvdGVSZXN1bHQpOiBBdmFpbGFiaWxpdHlPYmplY3Qge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaG90ZWw6IGhvdGVsLmlkLFxyXG4gICAgICBzdGFydERhdGU6IHRoaXMuaGVscGVycy5mb3JtYXRJc29EYXRlKHRoaXMuY2hlY2tpbl9kYXRlKSxcclxuICAgICAgZW5kRGF0ZTogdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUodGhpcy5jaGVja291dF9kYXRlKSxcclxuICAgICAgcm9vbXM6IHRoaXMubm9fb2Zfcm9vbXMsXHJcbiAgICAgIG9jY3VwYW50czogdGhpcy5ub19vZl9vY2N1cGFudHMsXHJcbiAgICAgIGN1cnJlbmN5OiAnR0JQJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJSZXN1bHRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoXHJcbiAgICAgIHRoaXMuZnVsbFJlc3VsdHMuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIHRoaXMuaW5QcmljZVJhbmdlKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5pbkRpc3RhbmNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNDaGFpbihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbClcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICAvLyBMaWdodGVuaW5nIEZpbHRlcnNcclxuICBwdWJsaWMgZmlsdGVyTGlnaHRlbmluZ1Jlc3VsdHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgdGhpcy5mdWxsUmVzdWx0cy5maWx0ZXIoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgdGhpcy5pbkxpZ2h0ZW5pbmdQcmljZVJhbmdlKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5jb250YWluc0hvdGVsbmFtZShob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuaGFzQ2hhaW4oaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmhhc1ByZWZlcnJlZChob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuZ2V0RXh0cmFGaWx0ZXIoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmdldEFtZW5pdGllc0ZpbHRlcihob3RlbClcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGluUHJpY2VSYW5nZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWwpO1xyXG4gICAgaWYgKGF2YWlsYWJpbGl0eSkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGF2YWlsYWJpbGl0eS5tYXhwcmljZSwgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UpICYmXHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmluUmFuZ2UoYXZhaWxhYmlsaXR5Lm1pbnByaWNlLCB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluRGlzdGFuY2VSYW5nZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXggPT09IDAgfHxcclxuICAgICAgdGhpcy5oZWxwZXJzLmluUmFuZ2UoaG90ZWwubG9jYXRpb24uZGlzdGFuY2UsIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29udGFpbnNIb3RlbG5hbWUoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdG9jaGVjayA9IHRoaXMuZmlsdGVycy5ob3RlbE5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICByZXR1cm4gdG9jaGVjayAmJiB0b2NoZWNrLmxlbmd0aCA+IDBcclxuICAgICAgPyBob3RlbC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModG9jaGVjaylcclxuICAgICAgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbkxpZ2h0ZW5pbmdQcmljZVJhbmdlKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoYXZhaWxhYmlsaXR5ICYmIE9iamVjdC5rZXlzKGF2YWlsYWJpbGl0eSkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIGxldCBtYXhSYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICBsZXQgZmluZE1heDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IG1pblJhbmdlID0gdGhpcy5oZWxwZXJzLmluUmFuZ2UoXHJcbiAgICAgICAgYXZhaWxhYmlsaXR5LnBycG4sXHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2VcclxuICAgICAgKTtcclxuICAgICAgaWYgKGF2YWlsYWJpbGl0eT8ubWF4cHJpY2UpIHtcclxuICAgICAgICBmaW5kTWF4ID0gYXZhaWxhYmlsaXR5Lm1heHByaWNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpbmRNYXggPSBhdmFpbGFiaWxpdHk/LnJvb21zLnJlZHVjZShcclxuICAgICAgICAgIChvcCwgaXRlbSkgPT4gKG9wID0gb3AgPiBpdGVtLnRvdGFsID8gb3AgOiBpdGVtLnRvdGFsKSxcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIG1heFJhbmdlID0gdGhpcy5oZWxwZXJzLmluUmFuZ2UoZmluZE1heCwgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gbWluUmFuZ2UgJiYgbWF4UmFuZ2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzQ2hhaW4oaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdG9jaGVjayA9ICh0aGlzLmZpbHRlcnMuY2hhaW4gfHwgW10pLm1hcCgoY2hhaW46IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICAgIHJldHVybiBjaGFpbi50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdG9jaGVjayAmJiB0b2NoZWNrLmxlbmd0aFxyXG4gICAgICA/ICEhdG9jaGVjay5maW5kKChjaGFpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGhvdGVsLmdyb3VwLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY2hhaW4pO1xyXG4gICAgICB9KVxyXG4gICAgICA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJyZWFrZmFzdFR5cGVGaWx0ZXIoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgaWYoIXRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmxlbmd0aCkgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdCA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZCh0aGlzLm1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbCkpO1xyXG4gICAgaWYoIWhvdGVsT2JqZWN0ICYmICFob3RlbE9iamVjdC52YWx1ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgaG90ZWxPYmplY3RWYWx1ZTogSG90ZWxBdmFsaWJpbGl0eVF1b3RlUmVzdWx0ID0gaG90ZWxPYmplY3QudmFsdWU7XHJcbiAgICBjb25zdCBpc0JyZWFrZmFzdEluY2x1ZGVkID0gdGhpcy5maWx0ZXJzLmJyZWFrZmFzdFR5cGUuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5CUkVBS0ZBU1RfSU5DTFVERUQpO1xyXG4gICAgY29uc3QgaXNCcmVha2Zhc3RFeGNsdWRlZCA9IHRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQlJFQUtGQVNUX05PVF9JTkNMVURFRCk7XHJcblxyXG4gICAgY29uc3QgYnJlYWtmYXN0TWF0Y2hlcyA9IGhvdGVsT2JqZWN0VmFsdWUucm9vbXMuZmlsdGVyKChyb29tczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYoaXNCcmVha2Zhc3RJbmNsdWRlZCAmJiBpc0JyZWFrZmFzdEV4Y2x1ZGVkKXtcclxuICAgICAgICAgIHJldHVybiByb29tcztcclxuICAgICAgICB9IGVsc2UgaWYoaXNCcmVha2Zhc3RJbmNsdWRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChpbmNsdWRlZEV4cHJlc3Npb24pICYmICFyb29tcy5yYXRlRGVzY3JpcHRpb24ubWF0Y2goZXhjbHVkZWRFeHByZXNzaW9uKTtcclxuICAgICAgICB9IGVsc2UgaWYoaXNCcmVha2Zhc3RFeGNsdWRlZCl7XHJcbiAgICAgICAgICByZXR1cm4gIXJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChpbmNsdWRlZEV4cHJlc3Npb24pIHx8IHJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChleGNsdWRlZEV4cHJlc3Npb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiAhIWJyZWFrZmFzdE1hdGNoZXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgYnlNb3N0RXhwZW5zaXZlKCkge1xyXG4gICAgdGhpcy5zb3J0QnlQcmljZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG1pblxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVidWcgc2V0IHRoaXMgdG8gdHJ1ZSB0byBvdXRwdXQgY29uc29sZSBsb2dzXHJcbiAgICogQGRlc2NyaXB0aW9uIHNvcnRzIHJlc3VsdHMgYnkgcHJpY2UgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWF0ZXIuIG1pbiA9IHRydWUgKGxvd2VzdCBwcmljZSBmaXJzdCksIG1pbiA9IGZhbHNlIChoaWdoZXN0IHByaWNlIGZpcnN0KVxyXG4gICAqIEluIHN1bW1hcnksIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzb3J0ZWQgYXJyYXkgb2YgaG90ZWxzIHdpdGggcHJpY2VzIGFuZCBhbiBhcnJheSBvZiBob3RlbHMgV0lUSE9VVCBwcmljZXMsXHJcbiAgICogdGhlbiBmaW5hbGx5IGpvaW5zIHRoZXNlIDIgdGVtcG9yYXJ5IGFycmF5cyB0b2dldGhlciBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgbmV4dCBvYnNlcnZhYmxlLlxyXG4gICAqL1xyXG5cclxuICBzb3J0QnlQcmljZShtaW4gPSB0cnVlLCBkZWJ1ZyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvLyBzdG9yZSBhbGwgcmVzdWx0c1xyXG4gICAgY29uc3QgaG90ZWxzOiBIb3RlbERldGFpbHNBcnJheSA9IHRoaXMuZnVsbFJlc3VsdHM7XHJcblxyXG4gICAgLy8gZ2V0IGhvdGVscyB3aXRoIGFuZCB3aXRob3V0IHByaWNlc1xyXG4gICAgY29uc3QgaG90ZWxzV2l0aFByaWNlczogSG90ZWxEZXRhaWxzQXJyYXkgPSBbXTtcclxuICAgIGNvbnN0IGhvdGVsc1dpdGhvdXRQcmljZXM6IEhvdGVsRGV0YWlsc0FycmF5ID0gW107XHJcbiAgICBob3RlbHMubWFwKChob3RlbFJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWxSZXN1bHQpPy5wcnBuXHJcbiAgICAgICAgPyBob3RlbHNXaXRoUHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpXHJcbiAgICAgICAgOiBob3RlbHNXaXRob3V0UHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc29ydCBob3RlbHMgd2l0aCBwcmljZXMgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWV0ZXIgZm9yIHRoZSBvcmRlclxyXG4gICAgaG90ZWxzV2l0aFByaWNlcy5zb3J0KChmaXJzdDogSG90ZWxEZXRhaWxzLCBzZWNvbmQ6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICBjb25zdCBmaXJzdFByaWNlID1cclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoZmlyc3QpPy5wcnBuO1xyXG4gICAgICBjb25zdCBzZWNvbmRQcmljZSA9XHJcbiAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKHNlY29uZCk/LnBycG47XHJcbiAgICAgIHJldHVybiBtaW5cclxuICAgICAgICA/IGZpcnN0UHJpY2UgPiBzZWNvbmRQcmljZVxyXG4gICAgICAgICAgPyAxXHJcbiAgICAgICAgICA6IHNlY29uZFByaWNlID4gZmlyc3RQcmljZVxyXG4gICAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICAgIDogMFxyXG4gICAgICAgIDogZmlyc3RQcmljZSA8IHNlY29uZFByaWNlXHJcbiAgICAgICAgICA/IDFcclxuICAgICAgICAgIDogc2Vjb25kUHJpY2UgPCBmaXJzdFByaWNlXHJcbiAgICAgICAgICAgID8gLTFcclxuICAgICAgICAgICAgOiAwO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gam9pbiBob3RlbHMgd2l0aCBwcmljZXMgdG8gaG90ZWxzIFdJVEhPVVQgcHJpY2VzXHJcbiAgICBjb25zdCBzb3J0ZWRIb3RlbHMgPSBbLi4uaG90ZWxzV2l0aFByaWNlcywgLi4uaG90ZWxzV2l0aG91dFByaWNlc107XHJcblxyXG4gICAgLy8gdHJpZ2dlciBuZXh0IG9ic2VydmFibGVcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHNvcnRlZEhvdGVscyk7XHJcblxyXG4gICAgLy8gZGlzcGxheSBjb25zb2xlIGxvZ3MgaWYgZGVidWcgaXMgdHJ1ZSAoY291bGQgcHJvdmUgdXNlZnVsIGluIGZ1dHVyZSlcclxuICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgc29ydEJ5UHJpY2UoKSBjYWxsZWQgKysnKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsICsrJywgaG90ZWxzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsc1dpdGhQcmljZXMgKysnLCBob3RlbHNXaXRoUHJpY2VzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsc1dpdGhvdXRQcmljZXMgKysnLCBob3RlbHNXaXRob3V0UHJpY2VzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIHNvcnRlZEhvdGVscyArKycsIHNvcnRlZEhvdGVscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb3J0QnlOYW1lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoXHJcbiAgICAgIHRoaXMucmVzdWx0cy52YWx1ZS5zb3J0KFxyXG4gICAgICAgIChmc3Q6IEhvdGVsRGV0YWlscywgc25kOiBIb3RlbERldGFpbHMpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGZzdC5uYW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzbmQubmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlEaXN0YW5jZSgpOiB2b2lkIHtcclxuICAgIGxldCByZXN1bHRzID0gdGhpcy5yZXN1bHRzLnZhbHVlIHx8IFtdO1xyXG4gICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICByZXR1cm4gTnVtYmVyKGEubG9jYXRpb24uZGlzdGFuY2UpIC0gTnVtYmVyKGIubG9jYXRpb24uZGlzdGFuY2UpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzKTtcclxuICB9XHJcblxyXG4gIGJ5UHJlZmVycmVkKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMudmFsdWUgfHwgW107XHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KChhOiBIb3RlbERldGFpbHMsIGI6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5wcmVmZXJyZWRUb0ludChiKSAtIHRoaXMucHJlZmVycmVkVG9JbnQoYSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVmZXJyZWRUb0ludChob3RlbDogSG90ZWxEZXRhaWxzKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIChob3RlbC5wcmVmZXJyZWQuY2xpZW50ID8gQ0xJRU5UX1BSRUZFUlJFRF9WQUxVRSA6IDApICtcclxuICAgICAgKGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA/IEFHRU5UX1BSRUZFUlJFRF9WQUxVRSA6IDApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRUb1ByZWZlcnJlZChwcmVmZXJyZWQ6IDAgfCAxIHwgMiB8IDMpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYml0d2lzZVxyXG4gICAgICBjbGllbnQ6IChwcmVmZXJyZWQgJiBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFKSA9PT0gQ0xJRU5UX1BSRUZFUlJFRF9WQUxVRSxcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgICAgIGNvbnN1bWVyOiAocHJlZmVycmVkICYgQUdFTlRfUFJFRkVSUkVEX1ZBTFVFKSA9PT0gQUdFTlRfUFJFRkVSUkVEX1ZBTFVFXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYWRkRmlsdGVyKGZpbHRlcjogc3RyaW5nLCB0eXBlOiBrZXlvZiBIb3RlbEZpbHRlcnMpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbHQ6IGFueSA9IHRoaXMubG9jYWxGaWx0ZXJzO1xyXG4gICAgZmlsdFt0eXBlXS5wdXNoKGZpbHRlcik7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGaWx0ZXIoZmlsdGVyOiBzdHJpbmcsIHR5cGU6IGtleW9mIEhvdGVsRmlsdGVycyk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsdCA9IHRoaXMubG9jYWxGaWx0ZXJzO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdFt0eXBlXSkpIHtcclxuICAgICAgKGZpbHRbdHlwZV0gYXMgc3RyaW5nW10pID0gKGZpbHRbdHlwZV0gYXMgc3RyaW5nW10pLmZpbHRlcihcclxuICAgICAgICAoY2hhaW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGZpbHRlciAhPT0gY2hhaW47XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuY2hhaW4gPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmFtZW5pdHl0eXBlID0gW107XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5wcmVmZXJyZWQgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmV4dHJhID0gW107XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5ob3RlbE5hbWUgPSAnJztcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmJyZWFrZmFzdFR5cGUgPSBbXTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUZyb21QcmV2aW91c1NlYXJjaGVzKFxyXG4gICAgcHJldmlvdXNJdGVtczogUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPlxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZmxpZ2h0SXRlbTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMgPVxyXG4gICAgICBwcmV2aW91c0l0ZW1zW1NlcnZpY2VUeXBlLkZsaWdodF0/LnNlYXJjaFF1ZXJ5O1xyXG4gICAgaWYgKGZsaWdodEl0ZW0pIHtcclxuICAgICAgLy8gVE9ETyBmbGlnaHRzIGhhdmVuJ3QgYmVlbiBkb25lIHlldC5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzUHJlZmVycmVkKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHByZWZlcnJlZEZpbHRlcnMgPSB0aGlzLmZpbHRlcnMucHJlZmVycmVkO1xyXG5cclxuICAgIC8vIEVtcHR5IHByZWZlcnJlZCBmaWx0ZXJzIE9SIFwiQW55XCJcclxuICAgIGlmIChcclxuICAgICAgIXByZWZlcnJlZEZpbHRlcnMubGVuZ3RoIHx8XHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BTlkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWdlbmN5IChjb25zdW1lcikgJiYgQ2xpZW50XHJcbiAgICBpZiAoXHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BR0VOQ1kpICYmXHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5DTElFTlQpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBob3RlbC5wcmVmZXJyZWQuY29uc3VtZXIgPT09IHRydWUgJiYgaG90ZWwucHJlZmVycmVkLmNsaWVudCA9PT0gdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFnZW5jeVxyXG4gICAgaWYgKHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BR0VOQ1kpKSB7XHJcbiAgICAgIHJldHVybiBob3RlbC5wcmVmZXJyZWQuY29uc3VtZXIgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xpZW50XHJcbiAgICBpZiAocHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkNMSUVOVCkpIHtcclxuICAgICAgcmV0dXJuIGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPT09IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0bWF4UHJpY2VGb3JDdXJyZW5jeShjdXJyZW5jeTogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UubWF4UHJpY2VGb3JDdXJyZW5jeShjdXJyZW5jeSk7XHJcbiAgfVxyXG5cclxuICAvLyBMaWdodGVuaW5nIEV4dHJhIEZpbHRlcnNcclxuICBwcml2YXRlIGdldEV4dHJhRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoZWNrQXZhaWxhYmlsaXR5ID0gdGhpcy5maWx0ZXJzLmV4dHJhLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkFWQUlMQUJJTElUWVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja0F2YWlsYWJpbGl0eSkge1xyXG4gICAgICByZXR1cm4gaG90ZWwudW5hdmFpbGFibGUgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hlY2tGZW1hbGVGcmllbmRseSA9IHRoaXMuZmlsdGVycy5leHRyYS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5GRU1BTEVfRlJJRU5ETFlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tGZW1hbGVGcmllbmRseSkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGhvdGVsLnRhZ3MuZmlsdGVyKCh0YWcpID0+IHtcclxuICAgICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcodGFnLm5hbWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lLmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgIHRoaXMuY29udmVydFRvT25lU3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgU2VhcmNoSGFuZGxlci5GRU1BTEVfRlJJRU5ETFlcclxuICAgICAgICAgICAgICApLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmxlbmd0aCA+IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gTGlnaHRlbmluZyBBbWVybml0aWVzIEZpbHRlcnNcclxuICBwcml2YXRlIGdldEFtZW5pdGllc0ZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUcnVlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHRoaXMuZmlsdGVycy5hbWVuaXR5dHlwZS5mb3JFYWNoKChzZWFyY2gpID0+IHtcclxuICAgICAgbGV0IGZpbHRlcmVkUmVzdWx0czogYW55ID0gaG90ZWwudGFncy5maWx0ZXIoKHRhZykgPT4ge1xyXG4gICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMuY29udmVydFRvT25lU3RyaW5nKHRhZy5uYW1lKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXModGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoc2VhcmNoKS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpc1RydWUgPSBmaWx0ZXJlZFJlc3VsdHMgJiYgZmlsdGVyZWRSZXN1bHRzLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBIb3RlbCAke2hvdGVsLm5hbWV9IHdpdGggZmlsdGVyIGFwcGxpZWRgLCBob3RlbD8udGFncywgaXNUcnVlKTtcclxuICAgICAgcmV0dXJuIGlzVHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGlzVHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29udmVydFRvT25lU3RyaW5nKGl0ZW06IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGl0ZW0ucmVwbGFjZSgvW15hLXpBLVpdL2csICcnKTtcclxuICB9XHJcblxyXG4gIGdldEltYWdlcyhIb2xpZGF5Q29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgdXJsID1cclxuICAgICAgdGhpcy5lbnZpcm9ubWVudC5ob3N0QmFzZVVybCArXHJcbiAgICAgIFVSTFMuQ09ORklSTUFfUEhPVE9fVVJMICtcclxuICAgICAgSG9saWRheUNvZGUuc3BsaXQoJywnKVswXTtcclxuICAgIGNvbnN0IGltZ1Byb3ZpZGVyID0gJ2h0dHBzOi8vd3d3LnZmbWlpLmNvbS8nOyAvLyBpbWcgcHJvdmlkZXIgdGhhdHMgaG9sZHMgaW1hZ2VzLCB1c2VkIHRvIG1hdGNoIHdoaWNoIGltYWdlcyBvbiBwYWdlIGJlbG9uZ3MgdG8gZ2FsbGVyeS5cclxuICAgIGlmICh0aGlzLmdhbGxlcmllc1tIb2xpZGF5Q29kZV0pIHtcclxuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENhbGxTZXJ2aWNlLmdldCh1cmwgYXMgVVJMUywgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KS5waXBlKFxyXG4gICAgICBtYXAoKGltYWdlc0hUTUwpID0+IHtcclxuICAgICAgICBpZiAoIWltYWdlc0hUTUwpIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKGBHYWxsZXJ5IGZvciAke0hvbGlkYXlDb2RlfSBjYW4gbm90IGJlIGxvYWRlZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRlbXAuaW5uZXJIVE1MID0gaW1hZ2VzSFRNTDtcclxuICAgICAgICBjb25zdCBpbWFnZXMgPSBBcnJheS5mcm9tKHRlbXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpKS5yZWR1Y2UoXHJcbiAgICAgICAgICAoYWNjLCBpbWcpID0+IHtcclxuICAgICAgICAgICAgaWYgKGltZy5zcmMuaW5jbHVkZXMoaW1nUHJvdmlkZXIpKSB7XHJcbiAgICAgICAgICAgICAgYWNjLnB1c2goaW1nLnNyYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBbXVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKCFpbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aHJvdyBFcnJvcihcclxuICAgICAgICAgICAgYFRoZXJlIGlzIG5vIG1lZGlhIGNvbnRlbnQgcHJvdmlkZWQgZm9yIHRoaXMgaG90ZWwgJHtIb2xpZGF5Q29kZX1gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSA9IGltYWdlcyk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFnaW5hdGlvblBhZ2UoY3VycmVudFBhZ2U6IG51bWJlcik6IGFueSB7XHJcbiAgICBjb25zdCBrZXkgPSAnUGFnaW5hdGlvblBhZ2VDb3VudCc7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKGtleSwgY3VycmVudFBhZ2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oa2V5KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVZpZXcoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gSG90ZWxWaWV3LkxJU1QpIHtcclxuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IEhvdGVsVmlldy5NQVA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gSG90ZWxWaWV3LkxJU1Q7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxjRGF5RGlmZigpOiBudW1iZXIge1xyXG4gICAgY29uc3QgY2hlY2tvdXQgPSBtb21lbnQodGhpcy5jaGVja291dF9kYXRlKTtcclxuICAgIGNvbnN0IGNoZWNraW4gPSBtb21lbnQodGhpcy5jaGVja2luX2RhdGUpO1xyXG4gICAgcmV0dXJuIGNoZWNrb3V0LnN0YXJ0T2YoKS5kaWZmKGNoZWNraW4uc3RhcnRPZigpLCAnZGF5cycpO1xyXG4gIH1cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBIb3RlbERldGFpbHNbXSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGNvbnN0IGN1cnJlbmNpZXNLZXkgPSBPYmplY3Qua2V5cyh0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuY3VycmVuY2llcyk7XHJcbiAgICBpZiAoKCFyZXN1bHRzLmxlbmd0aCAmJiAhY3VycmVuY2llc0tleS5sZW5ndGgpIHx8ICFjdXJyZW5jaWVzS2V5Lmxlbmd0aClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgY3VycmVuY2llID0gY3VycmVuY2llc0tleVswXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhbW91bnQ6IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5jdXJyZW5jaWVzW2N1cnJlbmNpZV0ubWlucHJpY2UsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogY3VycmVuY2llXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Um9vbU51bWJlcigpIHtcclxuICAgIGxldCByb29tc09jY3VwYW5jeTogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTnVtYmVyKHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyk7IGkrKykge1xyXG4gICAgICBjb25zdCBuZXdSb29tT2NjdXBhbmN5ID0ge1xyXG4gICAgICAgIEFkdWx0czogdGhpcy5jYWxjUm9vbU9jY3VwYW5jeSh0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMsIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMpLFxyXG4gICAgICAgIENoaWxkcmVuOiAwLFxyXG4gICAgICAgIEluZmFudHM6IDBcclxuICAgICAgfTtcclxuICAgICAgcm9vbXNPY2N1cGFuY3kucHVzaChuZXdSb29tT2NjdXBhbmN5KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcm9vbXM6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm9vbXNPY2N1cGFuY3kubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9vbXNPY2N1cGFuY3lbaW5kZXhdLkFkdWx0czsgaisrKSB7XHJcbiAgICAgICAgcm9vbXMucHVzaChpbmRleCsxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLSBzaG91bGQgd2UgYWRkIG5ldyBwcm9wZXJ0eSByb29tTnVtYmVyIGZvciB0cmF2ZWxsZXI/IC0tXHJcbiAgICAvLyBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmF2ZWxsZXJzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgLy8gICB0aGlzLnRyYXZlbGxlcnNbaW5kZXhdLnJvb21OdW1iZXIgPSByb29tc1tpbmRleF07XHJcbiAgICAvLyB9O1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqXHRAZGVzYyAtIHJldHVybiB0aGUgb2NjdXBhbmN5IGZvciBhIHJvb20gLSBuZWVkIHRvIGNhbGN1bGF0ZSBiYXNlZCBvbiBubyBvZiByb29tcywgbm8gb2YgdHJhdmVsbGVycyBhbmQgY3VycmVudGx5IG9jY3VwaWVkIHJvb21zO1xyXG4gICAqKi9cclxuXHJcbiAgIGNhbGNSb29tT2NjdXBhbmN5KG5vX29mX3Jvb21zOiBudW1iZXIsIHRyYXZlbGxlcnM6IG51bWJlcik6IG51bWJlcntcclxuICAgIGNvbnNvbGUubG9nKCdObyBvZiBUcmF2ZWxsZXJzOiAnICsgdHJhdmVsbGVycyArICd8IE5vIG9mIHJvb21zOiAnICsgbm9fb2Zfcm9vbXMgKyAnIHwgQXNzaWduZWQ6ICcgKyB0aGlzLm9jY3VwaWVkKTtcclxuICAgIGxldCByb29tT2NjdXBhbmN5OiBudW1iZXIgPSBNYXRoLmNlaWwodHJhdmVsbGVycy9ub19vZl9yb29tcyk7XHJcblxyXG4gICAgaWYgKHRyYXZlbGxlcnMgLSB0aGlzLm9jY3VwaWVkIDwgcm9vbU9jY3VwYW5jeSkge1xyXG4gICAgICBjb25zb2xlLmxvZygnV2UgaGF2ZSBydW4gb3V0IG9mIG9jY3VwaWVycyEnKTtcclxuICAgICAgcm9vbU9jY3VwYW5jeSA9IHRyYXZlbGxlcnMgLSB0aGlzLm9jY3VwaWVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb29tT2NjdXBhbmN5IDw9IDApIHtcclxuICAgICAgcm9vbU9jY3VwYW5jeSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vY2N1cGllZCArPSByb29tT2NjdXBhbmN5O1xyXG4gICAgcmV0dXJuIHJvb21PY2N1cGFuY3k7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRIb3RlbFJvb21Ub0Jhc2tldChcclxuICAgIGhvdGVsOiBIb3RlbFF1b3RlUmVzdWx0LFxyXG4gICAgaG90ZWxSb29tOiBIb3RlbFJvb20sXHJcbiAgICBob3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyxcclxuICAgIHRyYXZlbGxlcnM/OiBUcmF2ZWxsZXJbXVxyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGhvdGVsLnVuYXZhaWxhYmxlKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gbW9kaWZ5IHRoZSAnc3RhcnREYXRlJyBhbmQgJ2VuZERhdGUnIHByb3BlcnRpZXMgdG8gaGF2ZSBJU08gZm9ybWF0XHJcbiAgICBob3RlbFF1ZXJ5LnN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGhvdGVsUXVlcnkuc3RhcnREYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgaG90ZWxRdWVyeS5lbmREYXRlID0gbmV3IERhdGUoaG90ZWxRdWVyeS5lbmREYXRlKS50b0lTT1N0cmluZygpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBjb3B5IG9mIGhvdGVsUXVlcnkgYW5kIGRlbGV0ZSAnYWR1bHRzJyBwcm9wZXJ0eSBhcyBzZWFyY2hRdWVyeVNjaGVtYSBmb3IgaG90ZWwgKGNvbmZlcm1hKSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgaXQgYmVpbmcgYWRkZWRcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0geyAuLi5ob3RlbFF1ZXJ5IH07XHJcbiAgICBkZWxldGUgc2VhcmNoUXVlcnkuYWR1bHRzO1xyXG5cclxuICAgIGNvbnN0IGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UgPVxyXG4gICAgICBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuZ2V0RGVmYXVsdEJhc2tldCgpO1xyXG4gICAgY29uc3QgYmFza2V0ID0gaW50QmFza2V0Py5zdWJqZWN0LnZhbHVlO1xyXG4gICAgaWYgKGJhc2tldCkge1xyXG4gICAgICBjb25zdCB7IGFkZHJlc3M6IGhvdGVsQWFkZHJlc3MgfSA9IGhvdGVsO1xyXG4gICAgICBjb25zdCB7IHJhdGVEZXNjcmlwdGlvbiwgcm9vbURlc2NyaXB0aW9uLCByb29tSWQsIHJvb21UeXBlIH0gPSBob3RlbFJvb207XHJcbiAgICAgIHJldHVybiB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYWR1bHRzOiBob3RlbFF1ZXJ5LmFkdWx0cyxcclxuICAgICAgICAgIGJhc2tldDogYmFza2V0LmlkLFxyXG4gICAgICAgICAgc2VydmljZTogaG90ZWwuc291cmNlSWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICBjaGVja0luOiBob3RlbFF1ZXJ5LnN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgY2hlY2tPdXQ6IGhvdGVsUXVlcnkuZW5kRGF0ZSxcclxuICAgICAgICAgICAgaG90ZWxBZGRyZXNzOiB7XHJcbiAgICAgICAgICAgICAgc3RyZWV0TmFtZTogaG90ZWxBYWRkcmVzcy5hZGRyZXNzTGluZTEsXHJcbiAgICAgICAgICAgICAgdG93bjogaG90ZWxBYWRkcmVzcy5hZGRyZXNzTGluZTIsXHJcbiAgICAgICAgICAgICAgY291bnR5OiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMyxcclxuICAgICAgICAgICAgICBwb3N0Y29kZTogaG90ZWxBYWRkcmVzcy5wb3N0T3JaaXBDb2RlLFxyXG4gICAgICAgICAgICAgIGNvdW50cnlDb2RlOiBob3RlbEFhZGRyZXNzLmNvdW50cnlDb2RlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhvdGVsRGVzY3JpcHRpb246IGhvdGVsLmdyb3VwLFxyXG4gICAgICAgICAgICBob3RlbE5hbWU6IGhvdGVsLm5hbWUsXHJcbiAgICAgICAgICAgIG51bWJlck9mUm9vbXM6IGhvdGVsUXVlcnkucm9vbXMsXHJcbiAgICAgICAgICAgIHJhdGVEZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgcm9vbURlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICByb29tSWQsXHJcbiAgICAgICAgICAgIHJvb21UeXBlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcHJpY2U6IGhvdGVsUm9vbS50b3RhbCxcclxuICAgICAgICAgIGN1cnJlbmN5OiBob3RlbFJvb20uY3VycmVuY3lDb2RlIGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgICAgIHNlYXJjaFF1ZXJ5LFxyXG4gICAgICAgICAgb3V0Ym91bmREYXRlOiBob3RlbFF1ZXJ5LnN0YXJ0RGF0ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICB9XHJcbn1cclxuIl19
|