@boldadmin/angular-google-maps
Version:
Google Maps adapter for Angular Framework
268 lines • 21.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { EventPublisher } from '@boldadmin/event-publisher';
import { Coordinates } from '../value-object/coordinates';
import { Location } from '../value-object/location';
import { AngularGoogleMapsGeocoder } from './angular-google-maps-geocoder.service';
import { GoogleMapsFactory } from './google-maps-factory.service';
export class AngularGoogleMapsBuilder {
/**
* @param {?} googleMapsFactory
* @param {?} geocoder
* @param {?} eventPublisher
*/
constructor(googleMapsFactory, geocoder, eventPublisher) {
this.googleMapsFactory = googleMapsFactory;
this.geocoder = geocoder;
this.eventPublisher = eventPublisher;
}
/**
* @template THIS
* @this {THIS}
* @param {?} mapOptions
* @return {THIS}
*/
createMap(mapOptions) {
(/** @type {?} */ (this)).map = (/** @type {?} */ (this)).googleMapsFactory.createMap(mapOptions);
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} markerOptions
* @return {THIS}
*/
addCenterMarker(markerOptions) {
(/** @type {?} */ (this)).marker = (/** @type {?} */ (this)).googleMapsFactory.createMarker(markerOptions);
(/** @type {?} */ (this)).marker.setPosition((/** @type {?} */ (this)).map.getCenter());
(/** @type {?} */ (this)).marker.setMap((/** @type {?} */ (this)).map);
(/** @type {?} */ (this)).addMarkerListeners();
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} circleOptions
* @return {THIS}
*/
addCircle(circleOptions) {
(/** @type {?} */ (this)).circle = (/** @type {?} */ (this)).googleMapsFactory.createCircle(circleOptions);
(/** @type {?} */ (this)).circle.setMap((/** @type {?} */ (this)).map);
(/** @type {?} */ (this)).circle.addListener('radius_changed', (/**
* @return {?}
*/
() => (/** @type {?} */ (this)).notifyLocationChange()));
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} polylineOptions
* @return {THIS}
*/
addPolyline(polylineOptions) {
/** @type {?} */
const polyline = (/** @type {?} */ (this)).googleMapsFactory.createPolyline(polylineOptions);
polyline.setMap((/** @type {?} */ (this)).map);
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} markerOptions
* @return {THIS}
*/
addMarker(markerOptions) {
/** @type {?} */
const marker = (/** @type {?} */ (this)).googleMapsFactory.createMarker(markerOptions);
marker.setMap((/** @type {?} */ (this)).map);
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
bindCircleToMarker() {
(/** @type {?} */ (this)).circle.bindTo('center', (/** @type {?} */ (this)).marker, 'position');
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
hideMarker() {
(/** @type {?} */ (this)).marker.setMap(null);
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
hideCircle() {
(/** @type {?} */ (this)).circle.setMap(null);
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
addSearchBox() {
/** @type {?} */
const box = (/** @type {?} */ (this)).googleMapsFactory.createSearchBox();
box.addListener('places_changed', (/**
* @return {?}
*/
() => {
/** @type {?} */
const places = box.getPlaces();
if (places[0]) {
(/** @type {?} */ (this)).changeMapLocationAndZoom(places[0].geometry.location);
(/** @type {?} */ (this)).changeMarkerLocation(places[0].geometry.location);
/** @type {?} */
const loc = places[0].geometry.location;
/** @type {?} */
const coordinates = new Coordinates(loc.lat(), loc.lng());
(/** @type {?} */ (this)).eventPublisher.notify('locationChanged', new Location(coordinates, (/** @type {?} */ (this)).circle.getRadius()));
}
}));
return (/** @type {?} */ (this));
}
/**
* @private
* @return {?}
*/
addMarkerListeners() {
this.marker.addListener('dragend', (/**
* @return {?}
*/
() => this.notifyLocationChange()));
this.marker.addListener('dragend', (/**
* @param {?} mouseEvent
* @return {?}
*/
mouseEvent => this.reverseGeocode(mouseEvent)));
this.map.addListener('click', (/**
* @param {?} mouseEvent
* @return {?}
*/
mouseEvent => this.changeMarkerLocation(mouseEvent.latLng)));
this.map.addListener('click', (/**
* @return {?}
*/
() => this.notifyLocationChange()));
this.map.addListener('click', (/**
* @param {?} mouseEvent
* @return {?}
*/
mouseEvent => this.reverseGeocode(mouseEvent)));
}
/**
* @private
* @return {?}
*/
notifyLocationChange() {
this.eventPublisher.notify('locationChanged', new Location(this.getCoordinates(), this.getRadius()));
}
/**
* @private
* @return {?}
*/
getRadius() {
/** @type {?} */
let radiusInMeters = 0;
if (this.circle !== undefined)
radiusInMeters = this.circle.getRadius();
return radiusInMeters;
}
/**
* @private
* @return {?}
*/
getCoordinates() {
/** @type {?} */
let coordinates = new Coordinates(0, 0);
if (this.marker !== undefined)
coordinates = new Coordinates(this.marker.getPosition().lat(), this.marker.getPosition().lng());
return coordinates;
}
/**
* @private
* @param {?} location
* @return {?}
*/
changeMapLocationAndZoom(location) {
this.map.panTo(location);
this.map.setZoom(16);
}
/**
* @private
* @param {?} location
* @return {?}
*/
changeMarkerLocation(location) {
this.circle.setMap(this.map);
this.marker.setMap(this.map);
this.marker.setPosition(location);
}
/**
* @private
* @param {?} e
* @return {?}
*/
reverseGeocode(e) {
this.geocoder.reverseGeocode(new Coordinates(e.latLng.lat(), e.latLng.lng()), (/**
* @param {?} address
* @return {?}
*/
(address) => this.eventPublisher.notify('addressReverseGeocoded', address)));
}
}
AngularGoogleMapsBuilder.decorators = [
{ type: Injectable }
];
/** @nocollapse */
AngularGoogleMapsBuilder.ctorParameters = () => [
{ type: GoogleMapsFactory },
{ type: AngularGoogleMapsGeocoder },
{ type: EventPublisher }
];
if (false) {
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.map;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.marker;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.circle;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.googleMapsFactory;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.geocoder;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.eventPublisher;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1nb29nbGUtbWFwcy1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYm9sZGFkbWluL2FuZ3VsYXItZ29vZ2xlLW1hcHMvIiwic291cmNlcyI6WyJzZXJ2aWNlL2FuZ3VsYXItZ29vZ2xlLW1hcHMtYnVpbGRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ25ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFBO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBYWpFLE1BQU0sT0FBTyx3QkFBd0I7Ozs7OztJQU1qQyxZQUFvQixpQkFBb0MsRUFDcEMsUUFBbUMsRUFDbkMsY0FBOEI7UUFGOUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxhQUFRLEdBQVIsUUFBUSxDQUEyQjtRQUNuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFDL0MsQ0FBQzs7Ozs7OztJQUVKLFNBQVMsQ0FBQyxVQUFzQjtRQUM1QixtQkFBQSxJQUFJLEVBQUEsQ0FBQyxHQUFHLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXZELE9BQU8sbUJBQUEsSUFBSSxFQUFBLENBQUE7SUFDZixDQUFDOzs7Ozs7O0lBRUQsZUFBZSxDQUFDLGFBQTRCO1FBQ3hDLG1CQUFBLElBQUksRUFBQSxDQUFDLE1BQU0sR0FBRyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMs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QUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNyQyxDQUFDOzs7Ozs7SUFDTyxjQUFjLENBQUMsQ0FBYTtRQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Ozs7UUFBRSxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQzlGLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxFQUNoRSxDQUFBO0lBQ0wsQ0FBQzs7O1lBdEhKLFVBQVU7Ozs7WUFaRixpQkFBaUI7WUFEakIseUJBQXlCO1lBSHpCLGNBQWM7Ozs7Ozs7SUFtQm5CLHVDQUFnQjs7Ozs7SUFDaEIsMENBQXNCOzs7OztJQUN0QiwwQ0FBc0I7Ozs7O0lBRVYscURBQTRDOzs7OztJQUM1Qyw0Q0FBMkM7Ozs7O0lBQzNDLGtEQUFzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgRXZlbnRQdWJsaXNoZXIgfSBmcm9tICdAYm9sZGFkbWluL2V2ZW50LXB1Ymxpc2hlcidcbmltcG9ydCB7IENvb3JkaW5hdGVzIH0gZnJvbSAnLi4vdmFsdWUtb2JqZWN0L2Nvb3JkaW5hdGVzJ1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuLi92YWx1ZS1vYmplY3QvbG9jYXRpb24nXG5pbXBvcnQgeyBBbmd1bGFyR29vZ2xlTWFwc0dlb2NvZGVyIH0gZnJvbSAnLi9hbmd1bGFyLWdvb2dsZS1tYXBzLWdlb2NvZGVyLnNlcnZpY2UnXG5pbXBvcnQgeyBHb29nbGVNYXBzRmFjdG9yeSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtZmFjdG9yeS5zZXJ2aWNlJ1xuaW1wb3J0IENpcmNsZSA9IGdvb2dsZS5tYXBzLkNpcmNsZVxuaW1wb3J0IENpcmNsZU9wdGlvbnMgPSBnb29nbGUubWFwcy5DaXJjbGVPcHRpb25zXG5pbXBvcnQgTGF0TG5nID0gZ29vZ2xlLm1hcHMuTGF0TG5nXG5pbXBvcnQgTWFwID0gZ29vZ2xlLm1hcHMuTWFwXG5pbXBvcnQgTWFwT3B0aW9ucyA9IGdvb2dsZS5tYXBzLk1hcE9wdGlvbnNcbmltcG9ydCBNYXJrZXIgPSBnb29nbGUubWFwcy5NYXJrZXJcbmltcG9ydCBNYXJrZXJPcHRpb25zID0gZ29vZ2xlLm1hcHMuTWFya2VyT3B0aW9uc1xuaW1wb3J0IE1vdXNlRXZlbnQgPSBnb29nbGUubWFwcy5Nb3VzZUV2ZW50XG5pbXBvcnQgUG9seWxpbmVPcHRpb25zID0gZ29vZ2xlLm1hcHMuUG9seWxpbmVPcHRpb25zXG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJHb29nbGVNYXBzQnVpbGRlciB7XG5cbiAgICBwcml2YXRlIG1hcDogTWFwXG4gICAgcHJpdmF0ZSBtYXJrZXI6IE1hcmtlclxuICAgIHByaXZhdGUgY2lyY2xlOiBDaXJjbGVcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZ29vZ2xlTWFwc0ZhY3Rvcnk6IEdvb2dsZU1hcHNGYWN0b3J5LFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZ2VvY29kZXI6IEFuZ3VsYXJHb29nbGVNYXBzR2VvY29kZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBldmVudFB1Ymxpc2hlcjogRXZlbnRQdWJsaXNoZXJcbiAgICApIHt9XG5cbiAgICBjcmVhdGVNYXAobWFwT3B0aW9uczogTWFwT3B0aW9ucykge1xuICAgICAgICB0aGlzLm1hcCA9IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTWFwKG1hcE9wdGlvbnMpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhZGRDZW50ZXJNYXJrZXIobWFya2VyT3B0aW9uczogTWFya2VyT3B0aW9ucykge1xuICAgICAgICB0aGlzLm1hcmtlciA9IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTWFya2VyKG1hcmtlck9wdGlvbnMpXG4gICAgICAgIHRoaXMubWFya2VyLnNldFBvc2l0aW9uKHRoaXMubWFwLmdldENlbnRlcigpKVxuICAgICAgICB0aGlzLm1hcmtlci5zZXRNYXAodGhpcy5tYXApXG4gICAgICAgIHRoaXMuYWRkTWFya2VyTGlzdGVuZXJzKClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhZGRDaXJjbGUoY2lyY2xlT3B0aW9uczogQ2lyY2xlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmNpcmNsZSA9IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlQ2lyY2xlKGNpcmNsZU9wdGlvbnMpXG4gICAgICAgIHRoaXMuY2lyY2xlLnNldE1hcCh0aGlzLm1hcClcbiAgICAgICAgdGhpcy5jaXJjbGUuYWRkTGlzdGVuZXIoJ3JhZGl1c19jaGFuZ2VkJywgKCkgPT4gdGhpcy5ub3RpZnlMb2NhdGlvbkNoYW5nZSgpKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZFBvbHlsaW5lKHBvbHlsaW5lT3B0aW9uczogUG9seWxpbmVPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHBvbHlsaW5lID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVQb2x5bGluZShwb2x5bGluZU9wdGlvbnMpXG4gICAgICAgIHBvbHlsaW5lLnNldE1hcCh0aGlzLm1hcClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhZGRNYXJrZXIobWFya2VyT3B0aW9uczogTWFya2VyT3B0aW9ucykge1xuICAgICAgICBjb25zdCBtYXJrZXIgPSB0aGlzLmdvb2dsZU1hcHNGYWN0b3J5LmNyZWF0ZU1hcmtlcihtYXJrZXJPcHRpb25zKVxuICAgICAgICBtYXJrZXIuc2V0TWFwKHRoaXMubWFwKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGJpbmRDaXJjbGVUb01hcmtlcigpIHtcbiAgICAgICAgdGhpcy5jaXJjbGUuYmluZFRvKCdjZW50ZXInLCB0aGlzLm1hcmtlciwgJ3Bvc2l0aW9uJylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBoaWRlTWFya2VyKCkge1xuICAgICAgICB0aGlzLm1hcmtlci5zZXRNYXAobnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBoaWRlQ2lyY2xlKCkge1xuICAgICAgICB0aGlzLmNpcmNsZS5zZXRNYXAobnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhZGRTZWFyY2hCb3goKSB7XG4gICAgICAgIGNvbnN0IGJveCA9IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlU2VhcmNoQm94KClcblxuICAgICAgICBib3guYWRkTGlzdGVuZXIoJ3BsYWNlc19jaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VzID0gYm94LmdldFBsYWNlcygpXG4gICAgICAgICAgICBpZiAocGxhY2VzWzBdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VNYXBMb2NhdGlvbkFuZFpvb20ocGxhY2VzWzBdLmdlb21ldHJ5LmxvY2F0aW9uKVxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlTWFya2VyTG9jYXRpb24ocGxhY2VzWzBdLmdlb21ldHJ5LmxvY2F0aW9uKVxuICAgICAgICAgICAgICAgIGNvbnN0IGxvYyA9IHBsYWNlc1swXS5nZW9tZXRyeS5sb2NhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gbmV3IENvb3JkaW5hdGVzKGxvYy5sYXQoKSwgbG9jLmxuZygpKVxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRQdWJsaXNoZXIubm90aWZ5KCdsb2NhdGlvbkNoYW5nZWQnLCBuZXcgTG9jYXRpb24oY29vcmRpbmF0ZXMsIHRoaXMuY2lyY2xlLmdldFJhZGl1cygpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE1hcmtlckxpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy5tYXJrZXIuYWRkTGlzdGVuZXIoJ2RyYWdlbmQnLCAoKSA9PiB0aGlzLm5vdGlmeUxvY2F0aW9uQ2hhbmdlKCkpXG4gICAgICAgIHRoaXMubWFya2VyLmFkZExpc3RlbmVyKCdkcmFnZW5kJywgbW91c2VFdmVudCA9PiB0aGlzLnJldmVyc2VHZW9jb2RlKG1vdXNlRXZlbnQpKVxuICAgICAgICB0aGlzLm1hcC5hZGRMaXN0ZW5lcignY2xpY2snLCBtb3VzZUV2ZW50ID0+IHRoaXMuY2hhbmdlTWFya2VyTG9jYXRpb24obW91c2VFdmVudC5sYXRMbmcpKVxuICAgICAgICB0aGlzLm1hcC5hZGRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm5vdGlmeUxvY2F0aW9uQ2hhbmdlKCkpXG4gICAgICAgIHRoaXMubWFwLmFkZExpc3RlbmVyKCdjbGljaycsIG1vdXNlRXZlbnQgPT4gdGhpcy5yZXZlcnNlR2VvY29kZShtb3VzZUV2ZW50KSlcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUxvY2F0aW9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmV2ZW50UHVibGlzaGVyLm5vdGlmeSgnbG9jYXRpb25DaGFuZ2VkJywgbmV3IExvY2F0aW9uKHRoaXMuZ2V0Q29vcmRpbmF0ZXMoKSwgdGhpcy5nZXRSYWRpdXMoKSkpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSYWRpdXMoKSB7XG4gICAgICAgIGxldCByYWRpdXNJbk1ldGVycyA9IDBcbiAgICAgICAgaWYgKHRoaXMuY2lyY2xlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByYWRpdXNJbk1ldGVycyA9IHRoaXMuY2lyY2xlLmdldFJhZGl1cygpXG5cbiAgICAgICAgcmV0dXJuIHJhZGl1c0luTWV0ZXJzXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb29yZGluYXRlcygpIHtcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gbmV3IENvb3JkaW5hdGVzKDAsIDApXG4gICAgICAgIGlmICh0aGlzLm1hcmtlciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBuZXcgQ29vcmRpbmF0ZXModGhpcy5tYXJrZXIuZ2V0UG9zaXRpb24oKS5sYXQoKSwgdGhpcy5tYXJrZXIuZ2V0UG9zaXRpb24oKS5sbmcoKSlcblxuICAgICAgICByZXR1cm4gY29vcmRpbmF0ZXNcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZU1hcExvY2F0aW9uQW5kWm9vbShsb2NhdGlvbjogTGF0TG5nKSB7XG4gICAgICAgIHRoaXMubWFwLnBhblRvKGxvY2F0aW9uKVxuICAgICAgICB0aGlzLm1hcC5zZXRab29tKDE2KVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hhbmdlTWFya2VyTG9jYXRpb24obG9jYXRpb246IExhdExuZykge1xuICAgICAgICB0aGlzLmNpcmNsZS5zZXRNYXAodGhpcy5tYXApXG4gICAgICAgIHRoaXMubWFya2VyLnNldE1hcCh0aGlzLm1hcClcbiAgICAgICAgdGhpcy5tYXJrZXIuc2V0UG9zaXRpb24obG9jYXRpb24pXG4gICAgfVxuICAgIHByaXZhdGUgcmV2ZXJzZUdlb2NvZGUoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmdlb2NvZGVyLnJldmVyc2VHZW9jb2RlKG5ldyBDb29yZGluYXRlcyhlLmxhdExuZy5sYXQoKSwgZS5sYXRMbmcubG5nKCkpLCAoYWRkcmVzczogc3RyaW5nKSA9PlxuICAgICAgICAgICAgdGhpcy5ldmVudFB1Ymxpc2hlci5ub3RpZnkoJ2FkZHJlc3NSZXZlcnNlR2VvY29kZWQnLCBhZGRyZXNzKVxuICAgICAgICApXG4gICAgfVxufVxuIl19