Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["main"],{

/***/ "./dist/tb-geoloc-lib/fesm5/tb-geoloc-lib.js":
/*!***************************************************!*\
  !*** ./dist/tb-geoloc-lib/fesm5/tb-geoloc-lib.js ***!
  \***************************************************/
/*! exports provided: TbGeolocLibModule, TbGeolocLibComponent, MapComponent, GeocodingService, ElevationService, ɵa */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TbGeolocLibModule", function() { return TbGeolocLibModule; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TbGeolocLibComponent", function() { return TbGeolocLibComponent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapComponent", function() { return MapComponent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GeocodingService", function() { return GeocodingService; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ElevationService", function() { return ElevationService; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵa", function() { return OsmPlaceReadableAddressPipe; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! leaflet */ "./node_modules/leaflet/dist/leaflet-src.js");
/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _angular_common_http__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common/http */ "./node_modules/@angular/common/fesm5/http.js");
/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
/* harmony import */ var _angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/compiler/src/util */ "./node_modules/@angular/compiler/src/util.js");
/* harmony import */ var _angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js");
/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! leaflet-draw */ "./node_modules/leaflet-draw/dist/leaflet.draw.js");
/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(leaflet_draw__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js");
/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/platform-browser/animations */ "./node_modules/@angular/platform-browser/fesm5/animations.js");
/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js");
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _asymmetrik_ngx_leaflet__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @asymmetrik/ngx-leaflet */ "./node_modules/@asymmetrik/ngx-leaflet/dist/index.js");
/* harmony import */ var _asymmetrik_ngx_leaflet_draw__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @asymmetrik/ngx-leaflet-draw */ "./node_modules/@asymmetrik/ngx-leaflet-draw/dist/index.js");















/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var TbGeolocLibComponent = /** @class */ (function () {
    function TbGeolocLibComponent() {
    }
    /**
     * @return {?}
     */
    TbGeolocLibComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
    };
    TbGeolocLibComponent.decorators = [
        { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"], args: [{
                    selector: 'tb-geoloc-tb-geoloc-lib',
                    template: "",
                    styles: []
                },] },
    ];
    /** @nocollapse */
    TbGeolocLibComponent.ctorParameters = function () { return []; };
    return TbGeolocLibComponent;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * GeoPoint
 *
 * https://github.com/perfectline/geopoint
 *
 * Authors :
 * Tanel Suurhans (http://twitter.com/tanelsuurhans)
 * Tarmo Lehtpuu (http://twitter.com/tarmolehtpuu)
 *
 * License :
 * Copyright 2011 by PerfectLine LLC (http://www.perfectline.ee) and is released under the MIT license.
 */
/** @type {?} */
var GeoPoint = function (lon, lat) {
    switch (typeof (lon)) {
        case 'number':
            this.lonDeg = this.dec2deg(lon, this.MAX_LON);
            this.lonDec = lon;
            break;
        case 'string':
            if (this.decode(lon)) {
                this.lonDeg = lon;
            }
            this.lonDec = this.deg2dec(lon, this.MAX_LON);
            break;
    }
    switch (typeof (lat)) {
        case 'number':
            this.latDeg = this.dec2deg(lat, this.MAX_LAT);
            this.latDec = lat;
            break;
        case 'string':
            if (this.decode(lat)) {
                this.latDeg = lat;
            }
            this.latDec = this.deg2dec(lat, this.MAX_LAT);
            break;
    }
};
GeoPoint.prototype = {
    CHAR_DEG: '\u00B0',
    CHAR_MIN: '\u0027',
    CHAR_SEC: '\u0022',
    CHAR_SEP: '\u0020',
    MAX_LON: 180,
    MAX_LAT: 90,
    // decimal
    lonDec: NaN,
    latDec: NaN,
    // degrees
    lonDeg: NaN,
    latDeg: NaN,
    dec2deg: function (value, max) {
        /** @type {?} */
        var sign = value < 0 ? -1 : 1;
        /** @type {?} */
        var abs = Math.abs(Math.round(value * 1000000));
        if (abs > (max * 1000000)) {
            return NaN;
        }
        /** @type {?} */
        var dec = abs % 1000000 / 1000000;
        /** @type {?} */
        var deg = Math.floor(abs / 1000000) * sign;
        /** @type {?} */
        var min = Math.floor(dec * 60);
        /** @type {?} */
        var sec = (dec - min / 60) * 3600;
        /** @type {?} */
        var result = '';
        result += deg;
        result += this.CHAR_DEG;
        result += this.CHAR_SEP;
        result += min;
        result += this.CHAR_MIN;
        result += this.CHAR_SEP;
        result += sec.toFixed(2);
        result += this.CHAR_SEC;
        return result;
    },
    deg2dec: function (value) {
        /** @type {?} */
        var matches = this.decode(value);
        if (!matches) {
            return NaN;
        }
        /** @type {?} */
        var deg = parseFloat(matches[1]);
        /** @type {?} */
        var min = parseFloat(matches[2]);
        /** @type {?} */
        var sec = parseFloat(matches[3]);
        if (isNaN(deg) || isNaN(min) || isNaN(sec)) {
            return NaN;
        }
        return deg + (min / 60.0) + (sec / 3600);
    },
    decode: function (value) {
        /** @type {?} */
        var pattern = '';
        // deg
        pattern += '(-?\\d+)';
        pattern += this.CHAR_DEG;
        pattern += '\\s*';
        // min
        pattern += '(\\d+)';
        pattern += this.CHAR_MIN;
        pattern += '\\s*';
        // sec
        pattern += '(\\d+(?:\\.\\d+)?)';
        pattern += this.CHAR_SEC;
        return value.match(new RegExp(pattern));
    },
    getLonDec: function () {
        return this.lonDec;
    },
    getLatDec: function () {
        return this.latDec;
    },
    getLonDeg: function () {
        return this.lonDeg;
    },
    getLatDeg: function () {
        return this.latDeg;
    }
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** *
 *
 * \@param lat
 * \@param lng
 * \@param dragend callback
  @type {?} */
var draggableMarker = function (lat, lng, dragend) {
    /** @type {?} */
    var simpleIcon = simpleIconMarker();
    /** @type {?} */
    var marker$$1 = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["marker"])([lat, lng], { icon: simpleIcon, draggable: true });
    marker$$1.on('dragend', function (event) { return dragend(event); });
    return marker$$1;
};
/** *
 *
  @type {?} */
var simpleIconMarker = function () {
    return Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["icon"])({
        iconUrl: './assets/img/map/marker-icon.png',
        shadowUrl: './assets/img/map/marker-shadow.png',
        iconAnchor: [13, 40]
    });
};
/** *
 *
  @type {?} */
var drawControlPanel = new leaflet__WEBPACK_IMPORTED_MODULE_1__["Control"].Draw({
    position: 'topleft',
    draw: {
        marker: { icon: simpleIconMarker() },
        polyline: {},
        polygon: { showArea: true, metric: false },
        rectangle: false,
        circle: false,
        circlemarker: false
    }
});
/**
 *
 * @param {?} editedLayer
 * @return {?}
 */
function drawControlEditPanel(editedLayer) {
    return new leaflet__WEBPACK_IMPORTED_MODULE_1__["Control"].Draw({
        position: 'topleft',
        draw: {
            marker: false,
            polyline: false,
            polygon: false,
            rectangle: false,
            circle: false,
            circlemarker: false
        },
        edit: {
            featureGroup: editedLayer,
            // this panel id editing editedLayer
            edit: {},
            remove: {}
        }
    });
}
/** *
 *
  @type {?} */
var circleMarkerStyle = {
    radius: 6,
    fillColor: '#ff7800',
    color: '#000',
    weight: 1,
    opacity: 1,
    fillOpacity: 0.8
};
/** *
 *
  @type {?} */
var cityStyle = {
    color: '#ff7800',
    weight: 5,
    opacity: 0.65
};
/** *
 *
  @type {?} */
var gpsPhotoMarkerIcon = function () {
    return Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["icon"])({
        iconUrl: './assets/img/map/photo-marker-icon.png',
        shadowUrl: './assets/img/map/marker-shadow.png',
        iconSize: [33, 41],
        // size of the icon
        // shadowSize:   [50, 64], // size of the shadow
        iconAnchor: [13, 40],
        // point of the icon which will correspond to marker's location
        // shadowAnchor: [4, 62],  // the same for the shadow
        popupAnchor: [5, -41] // point from which the popup should open relative to the iconAnchor
    });
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * Auto format a DMS coordinates
 * eg. user can enter 43 0 14.77
 * and the formatter returns 43° 0' 14.77"
 * + avoid enter non numeric (or . ,) characters
 * + force entire numbers for degrees and minutes
 * @param {?} dmsStr
 * @return {?}
 */
function dmsFormatter(dmsStr) {
    try {
        // replace multiples spaces
        dmsStr = dmsStr.replace(/\s\s+/g, ' ');
        // replace space at first position
        if (dmsStr.charAt(0) === ' ') {
            dmsStr = dmsStr.slice(1, dmsStr.length - 1);
        }
        // replace , by .
        dmsStr = dmsStr.replace(',', '.');
        // delete all non numeric characters
        dmsStr = dmsStr.replace(/[^0-9\-.,°\'"\s]/g, '');
        /** @type {?} */
        var nbSpaces = void 0;
        /** @type {?} */
        var degChr = '';
        /** @type {?} */
        var minChr = '';
        /** @type {?} */
        var secChr = '';
        /** @type {?} */
        var v = dmsStr.split(' ');
        // remove last space od input string
        if (dmsStr.charAt(dmsStr.length - 1) === ' ') {
            v = v.slice(0, v.length - 1);
        }
        // remove last item of v array if it's empty
        if (v[v.length - 1] === '') {
            v = v.slice(0, v.length - 1);
        }
        if (v.length === 1) {
            degChr = v[0];
            // degChr must be an entire number
            if (degChr.indexOf('.') !== -1) {
                degChr = degChr.slice(0, degChr.indexOf('.'));
            }
            // between -90 & +90
            if (Number(degChr) < -90) {
                degChr = '-90';
            }
            if (Number(degChr) > 90) {
                degChr = '90';
            }
        }
        if (v.length === 2) {
            degChr = v[0];
            minChr = v[1];
            if (degChr.indexOf('.') !== -1) {
                degChr = degChr.slice(0, degChr.indexOf('.'));
            }
            if (minChr.indexOf('.') !== -1) {
                minChr = minChr.slice(0, degChr.indexOf('.'));
            }
            if (Number(degChr) < -90) {
                degChr = '-90';
            }
            if (Number(degChr) > 90) {
                degChr = '90';
            }
            if (Number(minChr) < -90) {
                minChr = '-90';
            }
            if (Number(minChr) > 90) {
                minChr = '90';
            }
        }
        if (v.length === 3) {
            degChr = v[0];
            minChr = v[1];
            secChr = v[2];
            if (degChr.indexOf('.') !== -1) {
                degChr = degChr.slice(0, degChr.indexOf('.'));
            }
            if (minChr.indexOf('.') !== -1) {
                minChr = minChr.slice(0, degChr.indexOf('.'));
            }
            if (Number(degChr) < -90) {
                degChr = '-90';
            }
            if (Number(degChr) > 90) {
                degChr = '90';
            }
            if (Number(minChr) < -90) {
                minChr = '-90';
            }
            if (Number(minChr) > 90) {
                minChr = '90';
            }
        }
        if (v.length >= 4) {
            v = v.slice(0, 2);
            if (degChr.indexOf('.') !== -1) {
                degChr = degChr.slice(0, degChr.indexOf('.'));
            }
            if (minChr.indexOf('.') !== -1) {
                minChr = minChr.slice(0, degChr.indexOf('.'));
            }
            if (Number(degChr) < -90) {
                degChr = '-90';
            }
            if (Number(degChr) > 90) {
                degChr = '90';
            }
            if (Number(minChr) < -90) {
                minChr = '-90';
            }
            if (Number(minChr) > 90) {
                minChr = '90';
            }
        }
        try {
            nbSpaces = dmsStr.match(/\s/g).length;
        }
        catch (e) {
            nbSpaces = 0;
        }
        if (nbSpaces === 0 && v.length === 1) ;
        else if (nbSpaces === 1 && v.length >= 1) {
            degChr = degChr.replace(' ', '');
            if (degChr.slice(degChr.length - 1, degChr.length) !== '°') {
                degChr += '° ';
            }
            else {
                degChr += ' ';
            }
        }
        else if (nbSpaces === 2 && v.length >= 2) {
            degChr = degChr.replace(' ', '');
            minChr = minChr.replace(' ', '');
            if (degChr.slice(degChr.length - 1, degChr.length) !== '°') {
                degChr += '° ';
            }
            else {
                degChr += ' ';
            }
            if (minChr.slice(minChr.length - 1, minChr.length) !== '\'') {
                minChr += '\' ';
            }
            else {
                minChr += ' ';
            }
        }
        else if (nbSpaces === 3 && v.length >= 3) {
            degChr = degChr.replace(' ', '');
            minChr = minChr.replace(' ', '');
            secChr = secChr.replace(' ', '');
            if (degChr.slice(degChr.length - 1, degChr.length) !== '°') {
                degChr += '° ';
            }
            else {
                degChr += ' ';
            }
            if (minChr.slice(minChr.length - 1, minChr.length) !== '\'') {
                minChr += '\' ';
            }
            else {
                minChr += ' ';
            }
            if (secChr.slice(secChr.length - 1, secChr.length) !== '"') {
                secChr += '"';
            }
        }
        else {
            throw { error: 'Can\'t manage input string.' };
        }
        return degChr + minChr + secChr;
    }
    catch (e) {
        return dmsStr;
    }
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var GeocodingService = /** @class */ (function () {
    function GeocodingService(http) {
        this.http = http;
    }
    /**
     * @param {?} address
     * @return {?}
     */
    GeocodingService.prototype.geocode = /**
     * @param {?} address
     * @return {?}
     */
    function (address) {
        if (address === null) {
            return Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["empty"])();
        }
        /** @type {?} */
        var url = "https://nominatim.openstreetmap.org/?format=json&addressdetails=1&q=" + address + "&format=json&limit=10&polygon_geojson=1";
        return this.http.get(url).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["map"])(function (obj) { return obj; }));
    };
    /**
     * @param {?} lat
     * @param {?} lng
     * @return {?}
     */
    GeocodingService.prototype.reverse = /**
     * @param {?} lat
     * @param {?} lng
     * @return {?}
     */
    function (lat, lng) {
        /** @type {?} */
        var url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=" + lat + "&lon=" + lng + "&polygon_geojson=1";
        return this.http.get(url).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["map"])(function (obj) { return obj; }));
    };
    /**
     * @param {?} osmPlaceResult
     * @return {?}
     */
    GeocodingService.prototype.getReadbleAddress = /**
     * @param {?} osmPlaceResult
     * @return {?}
     */
    function (osmPlaceResult) {
        /** @type {?} */
        var locality = null;
        /** @type {?} */
        var subLocality = null;
        /** @type {?} */
        var road = null;
        /** @type {?} */
        var neighbourhood = null;
        // Get "city" information (I mean city or something similar like village)
        if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.city)) {
            locality = osmPlaceResult.address.city;
        }
        else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.town)) {
            locality = osmPlaceResult.address.town;
        }
        else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.village)) {
            locality = osmPlaceResult.address.village;
        }
        else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.hamlet)) {
            locality = osmPlaceResult.address.hamlet;
        }
        // Get suburbr & if not defined : postcode
        if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.suburb) && Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.postcode) && locality !== null) {
            subLocality = osmPlaceResult.address.suburb + ', ' + osmPlaceResult.address.postcode;
        }
        else if (!Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.suburb) && Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.postcode) && locality !== null) {
            subLocality = osmPlaceResult.address.postcode;
        }
        // Get "road"
        if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.road)) {
            road = osmPlaceResult.address.road;
        }
        else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.pedestrian)) {
            road = osmPlaceResult.address.pedestrian;
        }
        // Get neighbourhood
        if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.neighbourhood)) {
            neighbourhood = osmPlaceResult.address.neighbourhood;
        }
        // Return
        if (road && neighbourhood && subLocality && locality) {
            return road + ' (' + neighbourhood + ') ' + subLocality + ' ' + locality;
        }
        else if (road && !neighbourhood && subLocality && locality) {
            return road + ' ' + subLocality + ' ' + locality;
        }
        else if (!road && neighbourhood && subLocality && locality) {
            return neighbourhood + ' ' + subLocality + ' ' + locality;
        }
        else if (!road && !neighbourhood && subLocality && locality) {
            return subLocality + ' ' + locality;
        }
        else if (!road && !neighbourhood && !subLocality && locality) {
            return locality;
        }
        else {
            return osmPlaceResult.display_name;
        }
    };
    /**
     * @param {?} osmClassFilter
     * @param {?} osmResults
     * @return {?}
     */
    GeocodingService.prototype.osmClassFilter = /**
     * @param {?} osmClassFilter
     * @param {?} osmResults
     * @return {?}
     */
    function (osmClassFilter, osmResults) {
        /** @type {?} */
        var osmFilteredResults = [];
        if (osmClassFilter.length > 0 && osmResults.length > 0) {
            osmResults.forEach(function (osmItem) {
                /** @type {?} */
                var filterMatchOccurence = 0;
                /** @type {?} */
                var removeOccurence = false;
                osmClassFilter.forEach(function (osmFilterItem) {
                    /** @type {?} */
                    var _class = osmFilterItem.split(':')[0];
                    /** @type {?} */
                    var _type = osmFilterItem.split(':')[1];
                    if (_type === '*') {
                        if (osmItem.class === _class) {
                            filterMatchOccurence++;
                        }
                    }
                    else {
                        // if !, remove
                        if (_type.substr(0, 1) === '!') {
                            if (osmItem.class === _class && '!' + osmItem.type === _type) {
                                removeOccurence = true;
                            }
                        }
                        else {
                            if (osmItem.class === _class && osmItem.type === _type) {
                                filterMatchOccurence++;
                            }
                        }
                    }
                });
                if (filterMatchOccurence > 0 && !removeOccurence) {
                    osmFilteredResults.push(osmItem);
                }
            });
            return Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["of"])(osmFilteredResults);
        }
        else {
            return Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["of"])(osmResults);
        }
    };
    /**
     * @param {?} coordinatesArray
     * @return {?}
     */
    GeocodingService.prototype.reverseCorrdinatesArray = /**
     * @param {?} coordinatesArray
     * @return {?}
     */
    function (coordinatesArray) {
        if (coordinatesArray.length > 0) {
            coordinatesArray.forEach(function (item) {
                item.reverse();
            });
            return coordinatesArray;
        }
    };
    /**
     * @param {?} coordinatesArray
     * @return {?}
     */
    GeocodingService.prototype.simplifyPolyline = /**
     * @param {?} coordinatesArray
     * @return {?}
     */
    function (coordinatesArray) {
        if (coordinatesArray.length > 1) {
            /** @type {?} */
            var firstCoordinate = coordinatesArray[0];
            /** @type {?} */
            var lastCoordinate = coordinatesArray[coordinatesArray.length - 1];
            return [firstCoordinate, lastCoordinate];
        }
        else {
            return coordinatesArray;
        }
    };
    GeocodingService.decorators = [
        { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"], args: [{
                    providedIn: 'root'
                },] },
    ];
    /** @nocollapse */
    GeocodingService.ctorParameters = function () { return [
        { type: _angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"] }
    ]; };
    /** @nocollapse */ GeocodingService.ngInjectableDef = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["defineInjectable"])({ factory: function GeocodingService_Factory() { return new GeocodingService(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["inject"])(_angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"])); }, token: GeocodingService, providedIn: "root" });
    return GeocodingService;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var ElevationService = /** @class */ (function () {
    function ElevationService(http) {
        this.http = http;
    }
    /**
     * @param {?} lat
     * @param {?} lng
     * @return {?}
     */
    ElevationService.prototype.getElevation = /**
     * @param {?} lat
     * @param {?} lng
     * @return {?}
     */
    function (lat, lng) {
        /** @type {?} */
        var apiUrl = "https://api.open-elevation.com/api/v1/lookup?locations=" + lat + "," + lng;
        return this.http.get(apiUrl).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["map"])(function (obj) { return obj.results[0].elevation; }));
    };
    ElevationService.decorators = [
        { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"], args: [{
                    providedIn: 'root'
                },] },
    ];
    /** @nocollapse */
    ElevationService.ctorParameters = function () { return [
        { type: _angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"] }
    ]; };
    /** @nocollapse */ ElevationService.ngInjectableDef = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["defineInjectable"])({ factory: function ElevationService_Factory() { return new ElevationService(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["inject"])(_angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"])); }, token: ElevationService, providedIn: "root" });
    return ElevationService;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var MapComponent = /** @class */ (function () {
    // ----
    // CODE
    // ----
    function MapComponent(fb, geocodeService, elevationService) {
        this.fb = fb;
        this.geocodeService = geocodeService;
        this.elevationService = elevationService;
        // --------------
        // INPUT / OUTPUT
        // --------------
        this.layersToAdd = ['osm'];
        this.osmClassFilter = [];
        this.location = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
        this.coordFormat = 'dms';
        // ---------
        // VARIABLES
        // ---------
        this._location = /** @type {?} */ ({});
        this.geolocatedPhotoLatLngData = [];
        this.geolocatedPhotoLatLngDisplayedColumnsTable = ['select', 'photoName', 'lat', 'lng', 'altitude'];
        this.isLoadingAddress = false;
        this.isLoadingLatitude = false;
        this.isLoadingLongitude = false;
        this.isLoadingElevation = false;
        // -------------
        // SUBSCRIPTIONS
        // -------------
        this.geoSearchSubscription = new rxjs__WEBPACK_IMPORTED_MODULE_3__["Subscription"];
        this.latDmsInputSubscription = new rxjs__WEBPACK_IMPORTED_MODULE_3__["Subscription"];
        this.lngDmsInputSubscription = new rxjs__WEBPACK_IMPORTED_MODULE_3__["Subscription"];
        this.mapLat = 0;
        this.mapLng = 0;
        this.osmLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"])('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: 'Open Street map' });
        this.googleSatelliteLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"])('http://{s}.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', { maxZoom: 20, subdomains: ['mt0', 'mt1', 'mt2', 'mt3'], attribution: 'Google maps' });
        this.googleHybridLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"])('http://{s}.google.com/vt/lyrs=s,h&x={x}&y={y}&z={z}', { maxZoom: 20, subdomains: ['mt0', 'mt1', 'mt2', 'mt3'], attribution: 'Google maps' });
        this.brgmLayer = leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"].wms('http://geoservices.brgm.fr/geologie', { version: '1.3.0', layers: 'Geologie' });
        this.mapLayers = {
            'Google': this.googleHybridLayer,
            'OSM': this.osmLayer,
            'BRGM': this.brgmLayer
        };
        this.geoResultsLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["geoJSON"])(null, { style: function () { return { color: '#ff7800', weight: 5, opacity: 0.65 }; } });
        this.geolocatedPhotoLatLngLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["geoJSON"])();
        // map options
        this.options = {
            layers: [this.osmLayer],
            zoom: 4,
            center: Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["latLng"])({ lat: 46.55886030311719, lng: 2.9882812500000004 })
        };
        // Leaflet map configuration
        this.drawnItems = new leaflet__WEBPACK_IMPORTED_MODULE_1__["FeatureGroup"]();
        this.drawControlFull = drawControlPanel;
        this.drawControlEdit = drawControlEditPanel(this.drawnItems);
        this.circleMarkerOpt = circleMarkerStyle;
        this.geoResultsOpt = cityStyle;
    }
    /**
     * - Create the forms
     * - Set up subscriptions (geo search, geolocated photos, lat / lng inputs)
     */
    /**
     * - Create the forms
     * - Set up subscriptions (geo search, geolocated photos, lat / lng inputs)
     * @return {?}
     */
    MapComponent.prototype.ngOnInit = /**
     * - Create the forms
     * - Set up subscriptions (geo search, geolocated photos, lat / lng inputs)
     * @return {?}
     */
    function () {
        var _this = this;
        // Create forms
        this.latlngFormGroup = this.fb.group({
            latInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDecValidator]),
            lngInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDecValidator]),
            dmsLatInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDmsValidator]),
            dmsLngInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDmsValidator])
        });
        this.elevationFormGroup = this.fb.group({
            elevationInput: this.fb.control('', null)
        });
        this.geoSearchFormGroup = this.fb.group({
            placeInput: this.fb.control('', null)
        });
        // Watch placeInput changes
        this.geoSearchSubscription = this.geoSearchFormGroup.controls["placeInput"].valueChanges
            .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["debounceTime"])(400), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["distinctUntilChanged"])(), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["switchMap"])(function (value) {
            _this.isLoadingAddress = true;
            return _this.geocodeService.geocode(value);
        })).subscribe(function (results) {
            _this.isLoadingAddress = false;
            // filter results if needed
            if (_this.osmClassFilter.length > 0) {
                _this.geocodeService.osmClassFilter(_this.osmClassFilter, results).subscribe(function (filteredResults) {
                    _this.geoSearchResults = filteredResults;
                });
            }
            else {
                _this.geoSearchResults = results;
            }
        }, function (error) {
            // @toto manage error
            // @toto manage error
            _this.isLoadingAddress = false;
        });
        // Watch geolocated photo input changes
        this.geolocatedPhotoLatLng.subscribe(function (photoLatLng) {
            // @todo clear this.geolocatedPhotoLatLngLayer
            // @todo clear this.geolocatedPhotoLatLngLayer
            _this.geolocatedPhotoLatLngData = photoLatLng;
            // For each geolocated photo, add marker and bind mouse event on thoses markers
            // For each geolocated photo, add marker and bind mouse event on thoses markers
            _this.geolocatedPhotoLatLngData.forEach(function (data) {
                /** @type {?} */
                var _latDms = data.lat.deg + '° ' + data.lat.min + '\'' + data.lat.sec + '"';
                /** @type {?} */
                var _lngDms = data.lng.deg + '° ' + data.lng.min + '\'' + data.lng.sec + '"';
                /** @type {?} */
                var g = new GeoPoint(_lngDms, _latDms);
                data.latDec = g.latDec;
                data.lngDec = g.lonDec;
                /** @type {?} */
                var latLng$$1 = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["latLng"])(data.latDec, data.lngDec);
                /** @type {?} */
                var gpsPhotoMarker = new leaflet__WEBPACK_IMPORTED_MODULE_1__["Marker"](latLng$$1, { icon: gpsPhotoMarkerIcon() });
                /** @type {?} */
                var html = "\n          <b>Fichier \"" + data.photoName + "\"</b><br>\n          Lat. : " + g.latDeg + "<br />\n          Lng. : " + g.lonDeg + "<br />\n          Alt. : " + data.altitude + " m<br /><br />\n          <b>Cliquez sur le point pour utiliser ces coordonn\u00E9es</b>";
                gpsPhotoMarker.bindPopup(html).openPopup();
                // Marker mouse events
                gpsPhotoMarker.on('click', (function (event) { _this.gpsMarkerSetValues(data.latDec, data.lngDec, data.altitude); }));
                gpsPhotoMarker.on('mouseover', function (event) { gpsPhotoMarker.openPopup(); });
                gpsPhotoMarker.on('mouseout', (function (event) { gpsPhotoMarker.closePopup(); }));
                // Add the marker to the map
                gpsPhotoMarker.addTo(_this.geolocatedPhotoLatLngLayer);
            });
            // Fit map to geolocated photos markers
            // Fit map to geolocated photos markers
            _this.flyToGeolocatedPhotoItems();
        });
        // Watch lat & lng DMS inputs changes and set up the DMS formatter
        // The DMS formatter restricts the keyboard input of the user : only number, comma, dot and '-', deg and min must be between -90 and +90
        // The formatter auto fill the ° ' and " characters to help the user input
        this.latDmsInputSubscription = this.latlngFormGroup.controls["dmsLatInput"].valueChanges.subscribe(function (value) {
            _this.latlngFormGroup.controls["dmsLatInput"].setValue(dmsFormatter(value), { emitEvent: false });
        });
        this.lngDmsInputSubscription = this.latlngFormGroup.controls["dmsLngInput"].valueChanges.subscribe(function (value) {
            _this.latlngFormGroup.controls["dmsLngInput"].setValue(dmsFormatter(value), { emitEvent: false });
        });
    };
    /**
     * Unsubscribe
     */
    /**
     * Unsubscribe
     * @return {?}
     */
    MapComponent.prototype.ngOnDestroy = /**
     * Unsubscribe
     * @return {?}
     */
    function () {
        this.geoSearchSubscription.unsubscribe();
        this.latDmsInputSubscription.unsubscribe();
        this.lngDmsInputSubscription.unsubscribe();
    };
    /**
     * Add layers and events listeners
     */
    /**
     * Add layers and events listeners
     * @param {?} map
     * @return {?}
     */
    MapComponent.prototype.onMapReady = /**
     * Add layers and events listeners
     * @param {?} map
     * @return {?}
     */
    function (map$$1) {
        var _this = this;
        this.map = map$$1;
        this.map.addControl(leaflet__WEBPACK_IMPORTED_MODULE_1__["control"].layers(null, this.mapLayers, { position: 'topright' }));
        this.map.addLayer(this.drawnItems);
        this.map.addLayer(this.geoResultsLayer);
        this.map.addLayer(this.geolocatedPhotoLatLngLayer);
        this.map.addControl(this.drawControlFull);
        this.map.on('draw:created', function (e) {
            _this.drawnItem = e['layer'];
            _this.drawType = e['layerType'];
            // If it's a marker, it must be draggable. By default, leaflet.draw module does not provide a draggable marker
            // So, we don't do a this.drawnItems.addLayer(layer);
            // We just draw a new draggableMarker instead
            if (_this.drawType === 'marker') {
                /** @type {?} */
                var latlng = _this.drawnItem._latlng;
                draggableMarker(latlng.lat, latlng.lng, function (dragEnd) { _this.callGeolocElevationApisUsingLatLngInputsValues(); }).addTo(_this.drawnItems);
            }
            else {
                _this.drawnItems.addLayer(_this.drawnItem);
            }
            // Show / hide control panels
            // if ONE item is drawn, set place and elevation inputs (call API)
            if (_this.drawnItems.getLayers().length > 0) {
                _this.setMapEditMode();
            }
            if (_this.drawnItems.getLayers().length === 1) {
                _this.callGeolocElevationApisUsingLatLngInputsValues();
            }
            _this.flyToDrawnItems();
        });
        this.map.on('draw:edited', function (e) {
            _this.drawnItem = e['layer'];
            _this.drawType = e['layerType'];
            //      this.drawnItems.addLayer(this.drawnItem);
            if (_this.drawnItems.getLayers().length === 1) {
                _this.callGeolocElevationApisUsingLatLngInputsValues();
            }
            _this.flyToDrawnItems();
        });
        this.map.on('draw:deleted', function (e) {
            _this.clearGeoResultsLayer();
            _this.clearDrawnItemsLayer();
            _this.setMapDrawMode();
            _this.clearForm();
        });
        this.redrawMap(100);
    };
    /**
     * When the map parent's div size change (eg. panel width), have to redraw the map
     * Sometimes (when opening / closing a tab), size change is detected too earlier, need to set a delay (about 10-100ms seems to be convenient)
     */
    /**
     * When the map parent's div size change (eg. panel width), have to redraw the map
     * Sometimes (when opening / closing a tab), size change is detected too earlier, need to set a delay (about 10-100ms seems to be convenient)
     * @param {?=} delay
     * @return {?}
     */
    MapComponent.prototype.redrawMap = /**
     * When the map parent's div size change (eg. panel width), have to redraw the map
     * Sometimes (when opening / closing a tab), size change is detected too earlier, need to set a delay (about 10-100ms seems to be convenient)
     * @param {?=} delay
     * @return {?}
     */
    function (delay) {
        var _this = this;
        if (delay) {
            window.setTimeout(function () { return _this.map.invalidateSize(); }, delay);
        }
        else {
            this.map.invalidateSize();
        }
    };
    /**
     * Show the "edit" toolbar inside map
     */
    /**
     * Show the "edit" toolbar inside map
     * @return {?}
     */
    MapComponent.prototype.setMapEditMode = /**
     * Show the "edit" toolbar inside map
     * @return {?}
     */
    function () {
        this.map.removeControl(this.drawControlFull);
        this.map.addControl(this.drawControlEdit);
    };
    /**
     * Show the "draw" toolbar inside map
     */
    /**
     * Show the "draw" toolbar inside map
     * @return {?}
     */
    MapComponent.prototype.setMapDrawMode = /**
     * Show the "draw" toolbar inside map
     * @return {?}
     */
    function () {
        this.map.removeControl(this.drawControlEdit);
        this.map.addControl(this.drawControlFull);
    };
    /**
     * Set map bounds to drawn items
     */
    /**
     * Set map bounds to drawn items
     * @param {?=} _maxZoom
     * @return {?}
     */
    MapComponent.prototype.flyToDrawnItems = /**
     * Set map bounds to drawn items
     * @param {?=} _maxZoom
     * @return {?}
     */
    function (_maxZoom) {
        if (_maxZoom === void 0) { _maxZoom = 14; }
        /** @type {?} */
        var b = this.drawnItems.getBounds();
        this.map.flyToBounds(b, { maxZoom: _maxZoom, animate: false });
    };
    /**
     * Set map bounds to geo reults items
     */
    /**
     * Set map bounds to geo reults items
     * @return {?}
     */
    MapComponent.prototype.flyToGeoResultsItems = /**
     * Set map bounds to geo reults items
     * @return {?}
     */
    function () {
        /** @type {?} */
        var b = this.geoResultsLayer.getBounds();
        this.map.flyToBounds(b, { maxZoom: 14, animate: false });
    };
    /**
     * Set map bounds to geolocated photos items
     */
    /**
     * Set map bounds to geolocated photos items
     * @return {?}
     */
    MapComponent.prototype.flyToGeolocatedPhotoItems = /**
     * Set map bounds to geolocated photos items
     * @return {?}
     */
    function () {
        /** @type {?} */
        var b = this.geolocatedPhotoLatLngLayer.getBounds();
        this.map.flyToBounds(b, { maxZoom: 14, animate: false });
    };
    /**
     * Draw a marker on drawItems featureGroup with DMS input values
     */
    /**
     * Draw a marker on drawItems featureGroup with DMS input values
     * @return {?}
     */
    MapComponent.prototype.addMarkerFromDmsCoord = /**
     * Draw a marker on drawItems featureGroup with DMS input values
     * @return {?}
     */
    function () {
        // clear drawn items layer
        this.clearDrawnItemsLayer();
        // update map toolbar
        this.setMapEditMode();
        /** @type {?} */
        var geopoint = new GeoPoint(this.latlngFormGroup.controls["dmsLngInput"].value, this.latlngFormGroup.controls["dmsLatInput"].value);
        draggableMarker(geopoint.getLatDec(), geopoint.getLonDec(), function (e) {
            /* dragend callback fn */ 
        }).addTo(this.drawnItems);
        // Set (decimal) latLng inputs
        this.latlngFormGroup.controls["latInput"].setValue(geopoint.getLatDec(), { emitEvent: false });
        this.latlngFormGroup.controls["lngInput"].setValue(geopoint.getLatDec(), { emitEvent: false });
        // Fly
        this.flyToDrawnItems();
    };
    /**
     * Draw a marker on drawItems featureGroup with decimal input values
     */
    /**
     * Draw a marker on drawItems featureGroup with decimal input values
     * @return {?}
     */
    MapComponent.prototype.addMarkerFromLatLngCoord = /**
     * Draw a marker on drawItems featureGroup with decimal input values
     * @return {?}
     */
    function () {
        // clear drawn items layer
        this.clearDrawnItemsLayer();
        // update map toolbar
        this.setMapEditMode();
        /** @type {?} */
        var geopoint = new GeoPoint(Number(this.latlngFormGroup.controls["lngInput"].value), Number(this.latlngFormGroup.controls["latInput"].value));
        draggableMarker(geopoint.getLatDec(), geopoint.getLonDec(), function (dragEnd) {
            /* dragend callback fn */ 
        }).addTo(this.drawnItems);
        // Set dmsLatLng inputs
        this.latlngFormGroup.controls["dmsLatInput"].setValue(geopoint.getLatDeg(), { emitEvent: false });
        this.latlngFormGroup.controls["dmsLngInput"].setValue(geopoint.getLonDeg(), { emitEvent: false });
        // Fly
        this.flyToDrawnItems();
    };
    /**
    *
    */
    /**
     *
     * @param {?} coordinates
     * @return {?}
     */
    MapComponent.prototype.addPolyline = /**
     *
     * @param {?} coordinates
     * @return {?}
     */
    function (coordinates) {
        // clear drawn items layer
        this.clearDrawnItemsLayer();
        // update map toolbar
        this.setMapEditMode();
        /** @type {?} */
        var polyline$$1 = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["polyline"])(coordinates);
        polyline$$1.addTo(this.drawnItems);
        // fly with max zoom
        this.flyToDrawnItems(18);
    };
    /**
     * Take latitude and longitude input values and call geocoding and elevation API
     * Sometimes you may want to force the elevation value and avoid calling elevation API (eg. elevation come from gps photo metadata)
     * then, you cas use the avoidCallingElevationApi option
     *
     * What is done inside this function :
     * - create an observable that zip all required observables
     * - do a switchmap on the main observable so that if one one the sub-observable change, old data are ignored
     * - when the main observable is finished, can send new location Output
     *
     * Several if / else avoidCallingElevationApi are used because when
     * avoidCallingElevationApi === false, httpTasks returns a single value (osmPlace)
     * whereas if avoidCallingElevationApi === true, httpTasks returns an array of 2 values [elevation, osmPlace]
     */
    /**
     * Take latitude and longitude input values and call geocoding and elevation API
     * Sometimes you may want to force the elevation value and avoid calling elevation API (eg. elevation come from gps photo metadata)
     * then, you cas use the avoidCallingElevationApi option
     *
     * What is done inside this function :
     * - create an observable that zip all required observables
     * - do a switchmap on the main observable so that if one one the sub-observable change, old data are ignored
     * - when the main observable is finished, can send new location Output
     *
     * Several if / else avoidCallingElevationApi are used because when
     * avoidCallingElevationApi === false, httpTasks returns a single value (osmPlace)
     * whereas if avoidCallingElevationApi === true, httpTasks returns an array of 2 values [elevation, osmPlace]
     * @param {?=} avoidCallingElevationApi
     * @param {?=} avoidCallingGeolocApi
     * @return {?}
     */
    MapComponent.prototype.callGeolocElevationApisUsingLatLngInputsValues = /**
     * Take latitude and longitude input values and call geocoding and elevation API
     * Sometimes you may want to force the elevation value and avoid calling elevation API (eg. elevation come from gps photo metadata)
     * then, you cas use the avoidCallingElevationApi option
     *
     * What is done inside this function :
     * - create an observable that zip all required observables
     * - do a switchmap on the main observable so that if one one the sub-observable change, old data are ignored
     * - when the main observable is finished, can send new location Output
     *
     * Several if / else avoidCallingElevationApi are used because when
     * avoidCallingElevationApi === false, httpTasks returns a single value (osmPlace)
     * whereas if avoidCallingElevationApi === true, httpTasks returns an array of 2 values [elevation, osmPlace]
     * @param {?=} avoidCallingElevationApi
     * @param {?=} avoidCallingGeolocApi
     * @return {?}
     */
    function (avoidCallingElevationApi, avoidCallingGeolocApi) {
        var _this = this;
        if (avoidCallingElevationApi === void 0) { avoidCallingElevationApi = false; }
        if (avoidCallingGeolocApi === void 0) { avoidCallingGeolocApi = false; }
        this.setLatLngInputFromDrawnItems();
        this.setLatLngDmsInputFromDrawnItems();
        /** @type {?} */
        var httpTasks;
        /** @type {?} */
        var elevation;
        /** @type {?} */
        var osmPlace;
        if (avoidCallingElevationApi && !avoidCallingGeolocApi) {
            httpTasks = this.reverseGeocodingFromInputValue();
        }
        else if (avoidCallingGeolocApi && !avoidCallingElevationApi) {
            httpTasks = this.getElevationFromInputValue();
        }
        else if (!avoidCallingElevationApi && !avoidCallingGeolocApi) {
            httpTasks = Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["zip"])(this.getElevationFromInputValue(), this.reverseGeocodingFromInputValue());
        }
        else if (avoidCallingElevationApi && avoidCallingGeolocApi) {
            // nothing to do ; throw or log an error ?
            return;
        }
        // spinnners on
        this.isLoadingAddress = !avoidCallingGeolocApi;
        this.isLoadingElevation = !avoidCallingElevationApi;
        httpTasks.subscribe(function (result) {
            _this.isLoadingElevation = false;
            _this.isLoadingAddress = false;
            if (avoidCallingElevationApi && !avoidCallingGeolocApi) {
                elevation = null;
                osmPlace = result;
            }
            else if (avoidCallingGeolocApi && !avoidCallingElevationApi) {
                elevation = result;
                osmPlace = null;
                elevation = result;
            }
            else if (!avoidCallingGeolocApi && !avoidCallingGeolocApi) {
                elevation = result[0];
                osmPlace = result[1];
            }
            // Set elevation input
            if (!avoidCallingElevationApi) {
                _this.elevationFormGroup.controls["elevationInput"].setValue(elevation);
            }
            // Patch place input value
            if (!avoidCallingGeolocApi) {
                _this.geoSearchFormGroup.controls["placeInput"].patchValue(_this.geocodeService.getReadbleAddress(osmPlace), { emitEvent: false });
            }
            // bind _location & emit location
            if (avoidCallingElevationApi) {
                _this.bindLocationOutput([_this.elevationFormGroup.controls["elevationInput"].value, osmPlace]);
            }
            else {
                _this.bindLocationOutput(result);
            }
        }, function (error) {
            // Manage error
            // spinnners off
            // Manage error
            // spinnners off
            _this.isLoadingAddress = false;
            _this.isLoadingElevation = false;
        });
    };
    /**
     * Should be improved for complex polygons / polylines ?
     * Could use turf.js
     */
    /**
     * Should be improved for complex polygons / polylines ?
     * Could use turf.js
     * @return {?}
     */
    MapComponent.prototype.setLatLngInputFromDrawnItems = /**
     * Should be improved for complex polygons / polylines ?
     * Could use turf.js
     * @return {?}
     */
    function () {
        /** @type {?} */
        var centroid = this.drawnItems.getBounds().getCenter();
        this.latlngFormGroup.controls["latInput"].setValue(centroid.lat);
        this.latlngFormGroup.controls["lngInput"].setValue(centroid.lng);
    };
    /**
     *
     */
    /**
     *
     * @return {?}
     */
    MapComponent.prototype.setLatLngDmsInputFromDrawnItems = /**
     *
     * @return {?}
     */
    function () {
        /** @type {?} */
        var centroid = this.drawnItems.getBounds().getCenter();
        /** @type {?} */
        var geopoint = new GeoPoint(centroid.lng, centroid.lat);
        this.latlngFormGroup.controls["dmsLatInput"].patchValue(geopoint.getLatDeg());
        this.latlngFormGroup.controls["dmsLngInput"].patchValue(geopoint.getLonDeg());
    };
    /**
     *
     */
    /**
     *
     * @return {?}
     */
    MapComponent.prototype.getElevationFromInputValue = /**
     *
     * @return {?}
     */
    function () {
        return this.elevationService.getElevation(this.latlngFormGroup.controls["latInput"].value, this.latlngFormGroup.controls["lngInput"].value);
    };
    /**
     * Reverse geocoding from lat / lng inputs values
     */
    /**
     * Reverse geocoding from lat / lng inputs values
     * @return {?}
     */
    MapComponent.prototype.reverseGeocodingFromInputValue = /**
     * Reverse geocoding from lat / lng inputs values
     * @return {?}
     */
    function () {
        return this.geocodeService.reverse(this.latlngFormGroup.controls["latInput"].value, this.latlngFormGroup.controls["lngInput"].value);
    };
    /**
     * Latitude / longitude DMS form Validator
     */
    /**
     * Latitude / longitude DMS form Validator
     * @param {?} control
     * @return {?}
     */
    MapComponent.prototype.latLngDmsValidator = /**
     * Latitude / longitude DMS form Validator
     * @param {?} control
     * @return {?}
     */
    function (control$$1) {
        /** @type {?} */
        var regexp = new RegExp('^(\\-)?[0-9]{1,2}\\° [0-9]{1,2}\\\' [0-9]{1,2}\\.[0-9]{1,12}\\"');
        return regexp.test(control$$1.value) ? null : { malformedLatLngDmsFormat: true };
    };
    /**
     * Latitude / longitude decimal form validator
     */
    /**
     * Latitude / longitude decimal form validator
     * @param {?} control
     * @return {?}
     */
    MapComponent.prototype.latLngDecValidator = /**
     * Latitude / longitude decimal form validator
     * @param {?} control
     * @return {?}
     */
    function (control$$1) {
        /** @type {?} */
        var regexp = new RegExp('^(\\-)?[0-9]{1,2}\\.[0-9]{1,20}');
        return regexp.test(control$$1.value) ? null : { malformedLatLngDecFormat: true };
    };
    /**
     * When user select an address within the autocomplete results list
     *
     * Call the geoloc API 2 times :
     *  - first call is for reverse geocoding
     *  - second call is for geoconding, so the address input (placeInput) is updated
     */
    /**
     * When user select an address within the autocomplete results list
     *
     * Call the geoloc API 2 times :
     *  - first call is for reverse geocoding
     *  - second call is for geoconding, so the address input (placeInput) is updated
     * @param {?} event
     * @return {?}
     */
    MapComponent.prototype.addressSelectedChanged = /**
     * When user select an address within the autocomplete results list
     *
     * Call the geoloc API 2 times :
     *  - first call is for reverse geocoding
     *  - second call is for geoconding, so the address input (placeInput) is updated
     * @param {?} event
     * @return {?}
     */
    function (event) {
        /** @type {?} */
        var osmPlace = event.option.value;
        /** @type {?} */
        var southWest = new leaflet__WEBPACK_IMPORTED_MODULE_1__["LatLng"](osmPlace.boundingbox[0], osmPlace.boundingbox[2]);
        /** @type {?} */
        var northEast = new leaflet__WEBPACK_IMPORTED_MODULE_1__["LatLng"](osmPlace.boundingbox[1], osmPlace.boundingbox[3]);
        this.map.fitBounds(Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["latLngBounds"])(southWest, northEast));
        // Add geojson to the map (if user enter a city, draw the administrative shape on the map)
        this.clearGeoResultsLayer();
        this.geoResultsLayer.addData(osmPlace.geojson);
        // Fly
        this.flyToGeoResultsItems();
        // Patch input value
        this.geoSearchFormGroup.controls["placeInput"].patchValue(this.geocodeService.getReadbleAddress(osmPlace), { emitEvent: false });
        /** @type {?} */
        var g = new GeoPoint(Number(osmPlace.lon), Number(osmPlace.lat));
        this.latlngFormGroup.controls["latInput"].setValue(osmPlace.lat, { emitEvent: false });
        this.latlngFormGroup.controls["lngInput"].setValue(osmPlace.lon, { emitEvent: false });
        this.latlngFormGroup.controls["dmsLatInput"].setValue(g.getLatDeg(), { emitEvent: false });
        this.latlngFormGroup.controls["dmsLngInput"].setValue(g.getLonDeg(), { emitEvent: false });
        this.elevationFormGroup.controls["elevationInput"].setValue(osmPlace.elevation, { emitEvent: false });
        // Draw a polyline or place a marker at the center of a polygon
        if (osmPlace.geojson.type === 'LineString') {
            // osm geojson coordinates is like [[long, lat], [long, lat], ...]
            // but leaflet needs [[lat, long], [lat, long], ...] format !
            this.geocodeService.simplifyPolyline(osmPlace.geojson.coordinates);
            this.addPolyline(/** @type {?} */ (this.geocodeService.reverseCorrdinatesArray(this.geocodeService.simplifyPolyline(osmPlace.geojson.coordinates))));
            this.clearGeoResultsLayer();
        }
        else {
            this.addMarkerFromLatLngCoord();
        }
        // Call geoloc and elevation APIs
        this.callGeolocElevationApisUsingLatLngInputsValues(false, false);
    };
    /**
     * Clear the form when nedded : 'draw:deleted', etc.
     */
    /**
     * Clear the form when nedded : 'draw:deleted', etc.
     * @return {?}
     */
    MapComponent.prototype.clearForm = /**
     * Clear the form when nedded : 'draw:deleted', etc.
     * @return {?}
     */
    function () {
        this.latlngFormGroup.controls["latInput"].setValue('', { emitEvent: false });
        this.latlngFormGroup.controls["lngInput"].setValue('', { emitEvent: false });
        this.latlngFormGroup.controls["dmsLatInput"].setValue('', { emitEvent: false });
        this.latlngFormGroup.controls["dmsLngInput"].setValue('', { emitEvent: false });
        this.latlngFormGroup.reset();
        this.elevationFormGroup.controls["elevationInput"].setValue('', { emitEvent: false });
        this.elevationFormGroup.reset();
        this.geoSearchFormGroup.controls["placeInput"].setValue('', { emitEvent: false });
    };
    /**
     * Clear geoResults layer (eg this layer contains administrative polygons -- "commune")
     */
    /**
     * Clear geoResults layer (eg this layer contains administrative polygons -- "commune")
     * @return {?}
     */
    MapComponent.prototype.clearGeoResultsLayer = /**
     * Clear geoResults layer (eg this layer contains administrative polygons -- "commune")
     * @return {?}
     */
    function () {
        this.geoResultsLayer.clearLayers();
    };
    /**
     *
     */
    /**
     *
     * @return {?}
     */
    MapComponent.prototype.clearDrawnItemsLayer = /**
     *
     * @return {?}
     */
    function () {
        this.drawnItems.clearLayers();
    };
    /**
     *
     */
    /**
     *
     * @return {?}
     */
    MapComponent.prototype.resetLocation = /**
     *
     * @return {?}
     */
    function () {
        this.location = null;
    };
    /**
     * Bind data from elevation and OSM http results to this._location
     * Perform some verifications to ensure data integrity
     * @param data data[0] = elevation, data[1] = osm data | data = osm data
     */
    /**
     * Bind data from elevation and OSM http results to this._location
     * Perform some verifications to ensure data integrity
     * @param {?} data data[0] = elevation, data[1] = osm data | data = osm data
     * @return {?}
     */
    MapComponent.prototype.bindLocationOutput = /**
     * Bind data from elevation and OSM http results to this._location
     * Perform some verifications to ensure data integrity
     * @param {?} data data[0] = elevation, data[1] = osm data | data = osm data
     * @return {?}
     */
    function (data) {
        /** @type {?} */
        var elevation;
        /** @type {?} */
        var osmPlace;
        if (Array.isArray(data)) {
            elevation = data[0];
            osmPlace = data[1];
        }
        else {
            elevation = this.elevationFormGroup.controls["elevationInput"].value;
            osmPlace = data;
        }
        this._location.geometry = this.drawnItems.toGeoJSON();
        // geodatum
        this._location.elevation = elevation;
        this._location.localityConsistency = this._location.localityConsistency ? true : null; // perform : Cohérence entre les coordonnées et la localité
        this._location.locationAccuracy = this._location.locationAccuracy ? 0 : null; // perform : Précision (ou incertitude) de la localisation, en mètres --> voir le nombre de décimales pour decLatInput ou decLngInput si point, sinon, demi-longeur de la bounding-box
        // published_location : Précision géographique à laquelle est publiée l'obs, permet de gérer le floutage - Précise, Localité, Maille 10x10km
        this._location.osmCountry = osmPlace.address.country;
        this._location.osmCountryCode = osmPlace.address.country_code;
        this._location.osmCounty = osmPlace.address.county;
        this._location.osmPostcode = osmPlace.address.postcode;
        if (osmPlace.address.city) {
            this._location.locality = osmPlace.address.city;
        }
        if (osmPlace.address.town) {
            this._location.locality = osmPlace.address.town;
        }
        if (osmPlace.address.village) {
            this._location.locality = osmPlace.address.village;
        }
        this._location.sublocality = osmPlace.hamlet;
        this._location.osmRoad = osmPlace.address.road;
        this._location.osmState = osmPlace.address.state;
        this._location.osmSuburb = osmPlace.address.suburb;
        this._location.osmId = osmPlace.osm_id;
        this._location.osmNeighbourhood = null; // not provided by nominatim
        this._location.osmPlaceId = osmPlace.place_id;
        this._location.publishedLocation = null; // perform
        this._location.station = null; // perform
        // Verifications
        // @todo
        // Emit
        this.location.next(this._location);
    };
    /**
     * Change the form coordinates format : 'decimal' or 'dms'
     */
    /**
     * Change the form coordinates format : 'decimal' or 'dms'
     * @param {?} format
     * @return {?}
     */
    MapComponent.prototype.setLatLngInputFormat = /**
     * Change the form coordinates format : 'decimal' or 'dms'
     * @param {?} format
     * @return {?}
     */
    function (format) {
        if (format !== 'decimal' && format !== 'dms') {
            return;
        }
        this.coordFormat = format;
    };
    /**
     * Set inputs values, add a marker and call API for a geolocated photo
     */
    /**
     * Set inputs values, add a marker and call API for a geolocated photo
     * @param {?} latDec
     * @param {?} lngDec
     * @param {?} elevation
     * @return {?}
     */
    MapComponent.prototype.gpsMarkerSetValues = /**
     * Set inputs values, add a marker and call API for a geolocated photo
     * @param {?} latDec
     * @param {?} lngDec
     * @param {?} elevation
     * @return {?}
     */
    function (latDec, lngDec, elevation) {
        // set inputs values
        this.latlngFormGroup.controls["latInput"].setValue(latDec);
        this.latlngFormGroup.controls["lngInput"].setValue(lngDec);
        this.elevationFormGroup.controls["elevationInput"].setValue(elevation);
        // add marker
        this.addMarkerFromLatLngCoord();
        // call APIs
        this.callGeolocElevationApisUsingLatLngInputsValues(true, false);
        // clear geolocated photos layer
        this.geolocatedPhotoLatLngLayer.clearLayers();
    };
    /**
     * @param {?} value
     * @return {?}
     */
    MapComponent.prototype.latLngDmsAutoFormatter = /**
     * @param {?} value
     * @return {?}
     */
    function (value) {
        return '';
    };
    MapComponent.decorators = [
        { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"], args: [{
                    selector: 'tb-geoloc-map',
                    template: "<h1>O\u00F9 ?</h1>\n  \n<div id=\"geoloc-map\">\n  <div id=\"geoloc-map-meta\">\n    <!-- geosearch autocomplete -->\n    <mat-form-field style=\"width: 100%;\">\n      <input matInput [formControl]=\"geoSearchFormGroup.controls.placeInput\" placeholder=\"Trouver un lieu\" aria-label=\"Trouver un lieu\" [matAutocomplete]=\"auto\">\n      <mat-spinner *ngIf=\"isLoadingAddress\" diameter=\"20\" matSuffix></mat-spinner>\n      <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"addressSelectedChanged($event)\">\n        <mat-option *ngFor=\"let address of geoSearchResults\" [value]=\"address\">\n          <span>{{ address | osmPlaceReadableAddress }}</span>\n        </mat-option>\n      </mat-autocomplete>\n    </mat-form-field>\n    \n    <div class=\"geolocationInputs\">\n      <div [formGroup]=\"latlngFormGroup\">\n        <div class=\"latLngMenuInputs\">\n          <!-- latitude / longitude decimal format -->\n          <div *ngIf=\"coordFormat=='decimal'\">\n            <!-- latitude / longitude format selection -->  \n            <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n              <mat-icon>more_vert</mat-icon>\n            </button>\n\n            <mat-form-field>\n              <input matInput formControlName=\"latInput\" placeholder=\"latitude\">\n              <mat-spinner *ngIf=\"isLoadingLatitude\" diameter=\"20\" matSuffix></mat-spinner>\n              <mat-error *ngIf=\"latlngFormGroup.controls.latInput.dirty && latlngFormGroup.controls.latInput.hasError('malformedLatLngDecFormat')\">Format non valide</mat-error>\n            </mat-form-field>\n            <mat-form-field>\n              <input matInput formControlName=\"lngInput\" placeholder=\"longitude\">\n              <mat-spinner *ngIf=\"isLoadingLongitude\" diameter=\"20\" matSuffix></mat-spinner>\n              <mat-error *ngIf=\"latlngFormGroup.controls.latInput.dirty && latlngFormGroup.controls.latInput.hasError('malformedLatLngDecFormat')\">Format non valide</mat-error>\n            </mat-form-field>\n            \n            <button mat-icon-button (click)=\"addMarkerFromLatLngCoord(); callGeolocElevationApisUsingLatLngInputsValues();\" [disabled]=\"!latlngFormGroup.controls.latInput.valid || !latlngFormGroup.controls.lngInput.valid\" color=\"primary\">\n              <mat-icon matTooltip=\"Utiliser ces coordonn\u00E9es\">where_to_vote</mat-icon>\n            </button>\n          </div>\n        </div>\n\n        <!-- menu format decimal / dms-->\n        <mat-menu #menu=\"matMenu\">\n          <button mat-menu-item (click)=\"setLatLngInputFormat('dms')\">Degr\u00E9s minutes secondes</button>\n          <button mat-menu-item (click)=\"setLatLngInputFormat('decimal')\">D\u00E9cimal</button>\n        </mat-menu>\n\n        <!-- latitude / longitude DMS format -->\n        <div *ngIf=\"coordFormat=='dms'\">\n          <!-- latitude / longitude format selection -->  \n          <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n            <mat-icon>more_vert</mat-icon>\n          </button>\n\n          <mat-form-field>\n            <input matInput formControlName=\"dmsLatInput\" placeholder=\"(deg)\u00B0  (min)'  (sec)&quot;\">\n            <span matPrefix>N&nbsp;</span>\n            <mat-spinner *ngIf=\"isLoadingLatitude\" diameter=\"20\" matSuffix></mat-spinner>\n            <mat-error *ngIf=\"latlngFormGroup.controls.dmsLatInput.dirty && latlngFormGroup.controls.dmsLatInput.hasError('malformedLatLngDmsFormat')\">Format non valide</mat-error>\n          </mat-form-field>\n\n          <mat-form-field>\n            <input matInput formControlName=\"dmsLngInput\" placeholder=\"(deg)\u00B0  (min)'  (sec)&quot;\">\n            <span matPrefix>E&nbsp;</span>\n            <mat-spinner *ngIf=\"isLoadingLongitude\" diameter=\"20\" matSuffix></mat-spinner>\n            <mat-error *ngIf=\"latlngFormGroup.controls.dmsLatInput.dirty && latlngFormGroup.controls.dmsLatInput.hasError('malformedLatLngDmsFormat')\">Format non valide</mat-error>\n          </mat-form-field>\n\n          <button mat-icon-button (click)=\"addMarkerFromDmsCoord(); callGeolocElevationApisUsingLatLngInputsValues();\" [disabled]=\"!latlngFormGroup.controls.dmsLatInput.valid || !latlngFormGroup.controls.dmsLngInput.valid\" color=\"primary\">\n            <mat-icon matTooltip=\"Utiliser ces coordonn\u00E9es\">where_to_vote</mat-icon>\n          </button>\n        </div>\n      </div>\n    \n      <!-- elevation -->\n      <div [formGroup]=\"elevationFormGroup\">\n        <mat-form-field style=\"width: 100px;\">\n          <input matInput formControlName=\"elevationInput\" placeholder=\"altitude\">\n          <mat-spinner *ngIf=\"isLoadingElevation\" diameter=\"20\" matSuffix></mat-spinner>\n          <span *ngIf=\"!isLoadingElevation\" matSuffix>m</span>\n        </mat-form-field>\n      </div>\n    </div>\n  </div>\n\n  <div id=\"geoloc-map-draw\" style=\"height: 400px;\"\n      leaflet \n      [leafletOptions]=\"options\"\n      (leafletMapReady)=\"onMapReady($event)\">\n  </div>\n</div>",
                    styles: ["[hidden]{display:none!important}#geoloc-map{display:flex;flex-direction:column;min-height:200px}#geoloc-map #geoloc-map-meta{flex:1;padding:15px}#geoloc-map #geoloc-map-meta .geolocationInputs{display:flex;flex-direction:row;justify-content:space-between}#geoloc-map #geoloc-map-draw{position:relative;flex:3}#geoloc-map #httpTasksRunningSpinner{flex:1}button .mini{min-width:0;line-height:30px}.geolocatedPhotoMetadataTable{width:100%}"]
                },] },
    ];
    /** @nocollapse */
    MapComponent.ctorParameters = function () { return [
        { type: _angular_forms__WEBPACK_IMPORTED_MODULE_6__["FormBuilder"] },
        { type: GeocodingService },
        { type: ElevationService }
    ]; };
    MapComponent.propDecorators = {
        layersToAdd: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
        geolocatedPhotoLatLng: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
        osmClassFilter: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
        location: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"] }]
    };
    return MapComponent;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * To show an address to the user, we could use the display_name attribute returned by nominatim
 * This attribute is far complicated to read (road, neighbourhood, suburb, town, city, postcode, county, country, etc.)
 * This pipe use the getReadbleAddress() function of geocode service to show minimal information about the address returned by nominatim API
 */
var OsmPlaceReadableAddressPipe = /** @class */ (function () {
    function OsmPlaceReadableAddressPipe(geocodeService) {
        this.geocodeService = geocodeService;
    }
    /**
     * @param {?} value
     * @param {?=} args
     * @return {?}
     */
    OsmPlaceReadableAddressPipe.prototype.transform = /**
     * @param {?} value
     * @param {?=} args
     * @return {?}
     */
    function (value, args) {
        return this.geocodeService.getReadbleAddress(value);
    };
    OsmPlaceReadableAddressPipe.decorators = [
        { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"], args: [{
                    name: 'osmPlaceReadableAddress'
                },] },
    ];
    /** @nocollapse */
    OsmPlaceReadableAddressPipe.ctorParameters = function () { return [
        { type: GeocodingService }
    ]; };
    return OsmPlaceReadableAddressPipe;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var TbGeolocLibModule = /** @class */ (function () {
    function TbGeolocLibModule() {
    }
    TbGeolocLibModule.decorators = [
        { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"], args: [{
                    imports: [
                        _angular_common__WEBPACK_IMPORTED_MODULE_8__["CommonModule"],
                        _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["BrowserAnimationsModule"],
                        _angular_platform_browser__WEBPACK_IMPORTED_MODULE_10__["BrowserModule"],
                        _angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClientModule"],
                        _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatSelectModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatAutocompleteModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatProgressSpinnerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatTooltipModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatChipsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatIconModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatRadioModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatProgressBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatMenuModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatTableModule"],
                        _asymmetrik_ngx_leaflet__WEBPACK_IMPORTED_MODULE_12__["LeafletModule"].forRoot(), _asymmetrik_ngx_leaflet_draw__WEBPACK_IMPORTED_MODULE_13__["LeafletDrawModule"].forRoot(),
                        _angular_forms__WEBPACK_IMPORTED_MODULE_6__["FormsModule"],
                        _angular_forms__WEBPACK_IMPORTED_MODULE_6__["ReactiveFormsModule"]
                    ],
                    declarations: [TbGeolocLibComponent, MapComponent, OsmPlaceReadableAddressPipe],
                    exports: [TbGeolocLibComponent, MapComponent]
                },] },
    ];
    return TbGeolocLibModule;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */



//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGItZ2VvbG9jLWxpYi5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vdGItZ2VvbG9jLWxpYi9saWIvdGItZ2VvbG9jLWxpYi5jb21wb25lbnQudHMiLCJuZzovL3RiLWdlb2xvYy1saWIvbGliL19oZWxwZXJzL2dlb0NvbnZlcnQudHMiLCJuZzovL3RiLWdlb2xvYy1saWIvbGliL19oZWxwZXJzL2xlYWZsZXRPYmplY3RzLnRzIiwibmc6Ly90Yi1nZW9sb2MtbGliL2xpYi9faGVscGVycy9kbXNUb29scy50cyIsIm5nOi8vdGItZ2VvbG9jLWxpYi9saWIvX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlLnRzIiwibmc6Ly90Yi1nZW9sb2MtbGliL2xpYi9fc2VydmljZXMvZWxldmF0aW9uLnNlcnZpY2UudHMiLCJuZzovL3RiLWdlb2xvYy1saWIvbGliL21hcC9tYXAuY29tcG9uZW50LnRzIiwibmc6Ly90Yi1nZW9sb2MtbGliL2xpYi9fcGlwZXMvb3NtLXBsYWNlLXJlYWRhYmxlLWFkZHJlc3MucGlwZS50cyIsIm5nOi8vdGItZ2VvbG9jLWxpYi9saWIvdGItZ2VvbG9jLWxpYi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGItZ2VvbG9jLXRiLWdlb2xvYy1saWInLFxuICB0ZW1wbGF0ZTogYGAsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgVGJHZW9sb2NMaWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxufVxuIiwiLyoqXG4gKiBHZW9Qb2ludFxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXJmZWN0bGluZS9nZW9wb2ludFxuICpcbiAqIEF1dGhvcnMgOlxuICogVGFuZWwgU3V1cmhhbnMgKGh0dHA6Ly90d2l0dGVyLmNvbS90YW5lbHN1dXJoYW5zKVxuICogVGFybW8gTGVodHB1dSAoaHR0cDovL3R3aXR0ZXIuY29tL3Rhcm1vbGVodHB1dSlcbiAqXG4gKiBMaWNlbnNlIDpcbiAqIENvcHlyaWdodCAyMDExIGJ5IFBlcmZlY3RMaW5lIExMQyAoaHR0cDovL3d3dy5wZXJmZWN0bGluZS5lZSkgYW5kIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY29uc3QgR2VvUG9pbnQgPSBmdW5jdGlvbihsb24sIGxhdCkge1xuXG5cbiAgc3dpdGNoICh0eXBlb2YobG9uKSkge1xuXG4gICAgICBjYXNlICdudW1iZXInOlxuXG4gICAgICAgICAgdGhpcy5sb25EZWcgPSB0aGlzLmRlYzJkZWcobG9uLCB0aGlzLk1BWF9MT04pO1xuICAgICAgICAgIHRoaXMubG9uRGVjID0gbG9uO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3N0cmluZyc6XG5cbiAgICAgICAgICBpZiAodGhpcy5kZWNvZGUobG9uKSkge1xuICAgICAgICAgICAgICB0aGlzLmxvbkRlZyA9IGxvbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmxvbkRlYyA9IHRoaXMuZGVnMmRlYyhsb24sIHRoaXMuTUFYX0xPTik7XG5cbiAgICAgICAgICBicmVhaztcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mKGxhdCkpIHtcblxuICAgICAgY2FzZSAnbnVtYmVyJzpcblxuICAgICAgICAgIHRoaXMubGF0RGVnID0gdGhpcy5kZWMyZGVnKGxhdCwgdGhpcy5NQVhfTEFUKTtcbiAgICAgICAgICB0aGlzLmxhdERlYyA9IGxhdDtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzdHJpbmcnOlxuXG4gICAgICAgICAgaWYgKHRoaXMuZGVjb2RlKGxhdCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5sYXREZWcgPSBsYXQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5sYXREZWMgPSB0aGlzLmRlZzJkZWMobGF0LCB0aGlzLk1BWF9MQVQpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgfVxufTtcblxuR2VvUG9pbnQucHJvdG90eXBlID0ge1xuXG4gIENIQVJfREVHIDogJ1xcdTAwQjAnLFxuICBDSEFSX01JTiA6ICdcXHUwMDI3JyxcbiAgQ0hBUl9TRUMgOiAnXFx1MDAyMicsXG4gIENIQVJfU0VQIDogJ1xcdTAwMjAnLFxuXG4gIE1BWF9MT046IDE4MCxcbiAgTUFYX0xBVDogOTAsXG5cbiAgLy8gZGVjaW1hbFxuICBsb25EZWM6IE5hTixcbiAgbGF0RGVjOiBOYU4sXG5cbiAgLy8gZGVncmVlc1xuICBsb25EZWc6IE5hTixcbiAgbGF0RGVnOiBOYU4sXG5cbiAgZGVjMmRlZzogZnVuY3Rpb24odmFsdWUsIG1heCkge1xuXG4gICAgICBjb25zdCBzaWduID0gdmFsdWUgPCAwID8gLTEgOiAxO1xuXG4gICAgICBjb25zdCBhYnMgPSBNYXRoLmFicyhNYXRoLnJvdW5kKHZhbHVlICogMTAwMDAwMCkpO1xuXG4gICAgICBpZiAoYWJzID4gKG1heCAqIDEwMDAwMDApKSB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjID0gYWJzICUgMTAwMDAwMCAvIDEwMDAwMDA7XG4gICAgICBjb25zdCBkZWcgPSBNYXRoLmZsb29yKGFicyAvIDEwMDAwMDApICogc2lnbjtcbiAgICAgIGNvbnN0IG1pbiA9IE1hdGguZmxvb3IoZGVjICogNjApO1xuICAgICAgY29uc3Qgc2VjID0gKGRlYyAtIG1pbiAvIDYwKSAqIDM2MDA7XG5cbiAgICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgICAgcmVzdWx0ICs9IGRlZztcbiAgICAgIHJlc3VsdCArPSB0aGlzLkNIQVJfREVHO1xuICAgICAgcmVzdWx0ICs9IHRoaXMuQ0hBUl9TRVA7XG4gICAgICByZXN1bHQgKz0gbWluO1xuICAgICAgcmVzdWx0ICs9IHRoaXMuQ0hBUl9NSU47XG4gICAgICByZXN1bHQgKz0gdGhpcy5DSEFSX1NFUDtcbiAgICAgIHJlc3VsdCArPSBzZWMudG9GaXhlZCgyKTtcbiAgICAgIHJlc3VsdCArPSB0aGlzLkNIQVJfU0VDO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gIH0sXG5cbiAgZGVnMmRlYzogZnVuY3Rpb24odmFsdWUpIHtcblxuICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZGVjb2RlKHZhbHVlKTtcblxuICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVnID0gcGFyc2VGbG9hdChtYXRjaGVzWzFdKTtcbiAgICAgIGNvbnN0IG1pbiA9IHBhcnNlRmxvYXQobWF0Y2hlc1syXSk7XG4gICAgICBjb25zdCBzZWMgPSBwYXJzZUZsb2F0KG1hdGNoZXNbM10pO1xuXG4gICAgICBpZiAoaXNOYU4oZGVnKSB8fCBpc05hTihtaW4pIHx8IGlzTmFOKHNlYykpIHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVnICsgKG1pbiAvIDYwLjApICsgKHNlYyAvIDM2MDApO1xuICB9LFxuXG4gIGRlY29kZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGxldCBwYXR0ZXJuID0gJyc7XG5cbiAgICAgIC8vIGRlZ1xuICAgICAgcGF0dGVybiArPSAnKC0/XFxcXGQrKSc7XG4gICAgICBwYXR0ZXJuICs9IHRoaXMuQ0hBUl9ERUc7XG4gICAgICBwYXR0ZXJuICs9ICdcXFxccyonO1xuXG4gICAgICAvLyBtaW5cbiAgICAgIHBhdHRlcm4gKz0gJyhcXFxcZCspJztcbiAgICAgIHBhdHRlcm4gKz0gdGhpcy5DSEFSX01JTjtcbiAgICAgIHBhdHRlcm4gKz0gJ1xcXFxzKic7XG5cbiAgICAgIC8vIHNlY1xuICAgICAgcGF0dGVybiArPSAnKFxcXFxkKyg/OlxcXFwuXFxcXGQrKT8pJztcbiAgICAgIHBhdHRlcm4gKz0gdGhpcy5DSEFSX1NFQztcblxuICAgICAgcmV0dXJuIHZhbHVlLm1hdGNoKG5ldyBSZWdFeHAocGF0dGVybikpO1xuICB9LFxuXG4gIGdldExvbkRlYzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb25EZWM7XG4gIH0sXG5cbiAgZ2V0TGF0RGVjOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhdERlYztcbiAgfSxcblxuICBnZXRMb25EZWc6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9uRGVnO1xuICB9LFxuXG4gIGdldExhdERlZzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXREZWc7XG4gIH1cblxufTtcbiIsIi8qKlxuICpcbiAqL1xuXG5pbXBvcnQgKiBhcyBMIGZyb20gJ2xlYWZsZXQnO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gbGF0XG4gKiBAcGFyYW0gbG5nXG4gKiBAcGFyYW0gZHJhZ2VuZCBjYWxsYmFja1xuICovXG5leHBvcnQgY29uc3QgZHJhZ2dhYmxlTWFya2VyID0gZnVuY3Rpb24obGF0OiBudW1iZXIsIGxuZzogbnVtYmVyLCBkcmFnZW5kOiBGdW5jdGlvbik6IEwuTWFya2VyIHtcbiAgY29uc3Qgc2ltcGxlSWNvbiA9IHNpbXBsZUljb25NYXJrZXIoKTtcbiAgY29uc3QgbWFya2VyID0gTC5tYXJrZXIoW2xhdCwgbG5nXSwge2ljb246IHNpbXBsZUljb24sIGRyYWdnYWJsZTogdHJ1ZX0pO1xuICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gZHJhZ2VuZChldmVudCk7IH0pO1xuICByZXR1cm4gbWFya2VyO1xufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY29uc3Qgc2ltcGxlSWNvbk1hcmtlciA9IGZ1bmN0aW9uKCk6IEwuSWNvbiB7XG4gIHJldHVybiBMLmljb24oe1xuICAgIGljb25Vcmw6ICcuL2Fzc2V0cy9pbWcvbWFwL21hcmtlci1pY29uLnBuZycsXG4gICAgc2hhZG93VXJsOiAnLi9hc3NldHMvaW1nL21hcC9tYXJrZXItc2hhZG93LnBuZycsXG4gICAgaWNvbkFuY2hvcjogWzEzLCA0MF1cbiAgfSk7XG59O1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBkcmF3Q29udHJvbFBhbmVsID0gbmV3IEwuQ29udHJvbC5EcmF3KHtcbiAgcG9zaXRpb246ICd0b3BsZWZ0JyxcbiAgZHJhdzoge1xuICAgIG1hcmtlcjogeyBpY29uOiBzaW1wbGVJY29uTWFya2VyKCkgfSxcbiAgICBwb2x5bGluZToge30sXG4gICAgcG9seWdvbjogeyBzaG93QXJlYTogdHJ1ZSwgbWV0cmljOiBmYWxzZSB9LFxuICAgIHJlY3RhbmdsZTogZmFsc2UsXG4gICAgY2lyY2xlOiBmYWxzZSxcbiAgICBjaXJjbGVtYXJrZXI6IGZhbHNlXG4gIH1cbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZWRpdGVkTGF5ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYXdDb250cm9sRWRpdFBhbmVsKGVkaXRlZExheWVyKSB7XG4gIHJldHVybiBuZXcgTC5Db250cm9sLkRyYXcoe1xuICAgIHBvc2l0aW9uOiAndG9wbGVmdCcsXG4gICAgZHJhdzoge1xuICAgICAgbWFya2VyOiBmYWxzZSxcbiAgICAgIHBvbHlsaW5lOiBmYWxzZSxcbiAgICAgIHBvbHlnb246IGZhbHNlLFxuICAgICAgcmVjdGFuZ2xlOiBmYWxzZSxcbiAgICAgIGNpcmNsZTogZmFsc2UsXG4gICAgICBjaXJjbGVtYXJrZXI6IGZhbHNlXG4gICAgfSxcbiAgICBlZGl0OiB7XG4gICAgICBmZWF0dXJlR3JvdXA6IGVkaXRlZExheWVyLCAvLyB0aGlzIHBhbmVsIGlkIGVkaXRpbmcgZWRpdGVkTGF5ZXJcbiAgICAgIGVkaXQ6IHt9LFxuICAgICAgcmVtb3ZlOiB7fVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGNpcmNsZU1hcmtlclN0eWxlID0ge1xuICByYWRpdXM6IDYsXG4gIGZpbGxDb2xvcjogJyNmZjc4MDAnLFxuICBjb2xvcjogJyMwMDAnLFxuICB3ZWlnaHQ6IDEsXG4gIG9wYWNpdHk6IDEsXG4gIGZpbGxPcGFjaXR5OiAwLjhcbn07XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGNpdHlTdHlsZSA9IHtcbiAgY29sb3I6ICcjZmY3ODAwJyxcbiAgICB3ZWlnaHQ6IDUsXG4gICAgb3BhY2l0eTogMC42NVxufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ3BzUGhvdG9NYXJrZXJJY29uID0gKCk6IEwuSWNvbiA9PiB7XG4gIHJldHVybiBMLmljb24oe1xuICAgIGljb25Vcmw6ICcuL2Fzc2V0cy9pbWcvbWFwL3Bob3RvLW1hcmtlci1pY29uLnBuZycsXG4gICAgc2hhZG93VXJsOiAnLi9hc3NldHMvaW1nL21hcC9tYXJrZXItc2hhZG93LnBuZycsXG5cbiAgICBpY29uU2l6ZTogICAgIFszMywgNDFdLCAvLyBzaXplIG9mIHRoZSBpY29uXG4gICAgLy8gc2hhZG93U2l6ZTogICBbNTAsIDY0XSwgLy8gc2l6ZSBvZiB0aGUgc2hhZG93XG4gICAgaWNvbkFuY2hvcjogICBbMTMsIDQwXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXG4gICAgLy8gc2hhZG93QW5jaG9yOiBbNCwgNjJdLCAgLy8gdGhlIHNhbWUgZm9yIHRoZSBzaGFkb3dcbiAgICBwb3B1cEFuY2hvcjogIFs1LCAtNDFdIC8vIHBvaW50IGZyb20gd2hpY2ggdGhlIHBvcHVwIHNob3VsZCBvcGVuIHJlbGF0aXZlIHRvIHRoZSBpY29uQW5jaG9yXG4gIH0pO1xufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ3BzUGhvdG9NYXJrZXJJY29uSGlnaGxpZ2h0ID0gKCk6IEwuSWNvbiA9PiB7XG4gIHJldHVybiBMLmljb24oe1xuICAgIGljb25Vcmw6ICcuL2Fzc2V0cy9pbWcvbWFwL3Bob3RvLW1hcmtlci1pY29uLnBuZycsXG4gICAgc2hhZG93VXJsOiAnLi9hc3NldHMvaW1nL21hcC9tYXJrZXItc2hhZG93LnBuZycsXG5cbiAgICBpY29uU2l6ZTogICAgIFs0MywgNTRdLCAvLyBzaXplIG9mIHRoZSBpY29uXG4gICAgLy8gc2hhZG93U2l6ZTogICBbNTAsIDY0XSwgLy8gc2l6ZSBvZiB0aGUgc2hhZG93XG4gICAgaWNvbkFuY2hvcjogICBbMTMsIDQwXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXG4gICAgLy8gc2hhZG93QW5jaG9yOiBbNCwgNjJdLCAgLy8gdGhlIHNhbWUgZm9yIHRoZSBzaGFkb3dcbiAgICBwb3B1cEFuY2hvcjogIFswLCAtNzZdIC8vIHBvaW50IGZyb20gd2hpY2ggdGhlIHBvcHVwIHNob3VsZCBvcGVuIHJlbGF0aXZlIHRvIHRoZSBpY29uQW5jaG9yXG4gIH0pO1xufTtcbiIsIi8qKlxuICogQXV0byBmb3JtYXQgYSBETVMgY29vcmRpbmF0ZXNcbiAqIGVnLiB1c2VyIGNhbiBlbnRlciA0MyAwIDE0Ljc3XG4gKiBhbmQgdGhlIGZvcm1hdHRlciByZXR1cm5zIDQzw4LCsCAwJyAxNC43N1wiXG4gKiArIGF2b2lkIGVudGVyIG5vbiBudW1lcmljIChvciAuICwpIGNoYXJhY3RlcnNcbiAqICsgZm9yY2UgZW50aXJlIG51bWJlcnMgZm9yIGRlZ3JlZXMgYW5kIG1pbnV0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRtc0Zvcm1hdHRlcihkbXNTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgLy8gcmVwbGFjZSBtdWx0aXBsZXMgc3BhY2VzXG4gICAgZG1zU3RyID0gZG1zU3RyLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcbiAgICAvLyByZXBsYWNlIHNwYWNlIGF0IGZpcnN0IHBvc2l0aW9uXG4gICAgaWYgKGRtc1N0ci5jaGFyQXQoMCkgPT09ICcgJykgeyBkbXNTdHIgPSBkbXNTdHIuc2xpY2UoMSwgZG1zU3RyLmxlbmd0aCAtIDEpOyB9XG4gICAgLy8gcmVwbGFjZSAsIGJ5IC5cbiAgICBkbXNTdHIgPSBkbXNTdHIucmVwbGFjZSgnLCcsICcuJyk7XG4gICAgLy8gZGVsZXRlIGFsbCBub24gbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgZG1zU3RyID0gZG1zU3RyLnJlcGxhY2UoL1teMC05XFwtLizDgsKwXFwnXCJcXHNdL2csICcnKTtcblxuICAgIGxldCBuYlNwYWNlczogbnVtYmVyO1xuICAgIGxldCBkZWdDaHIgPSAnJztcbiAgICBsZXQgbWluQ2hyID0gJyc7XG4gICAgbGV0IHNlY0NociA9ICcnO1xuXG4gICAgbGV0IHYgPSBkbXNTdHIuc3BsaXQoJyAnKTtcbiAgICAvLyByZW1vdmUgbGFzdCBzcGFjZSBvZCBpbnB1dCBzdHJpbmdcbiAgICBpZiAoZG1zU3RyLmNoYXJBdChkbXNTdHIubGVuZ3RoIC0gMSkgPT09ICcgJykge1xuICAgICAgdiA9IHYuc2xpY2UoMCAsIHYubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBsYXN0IGl0ZW0gb2YgdiBhcnJheSBpZiBpdCdzIGVtcHR5XG4gICAgaWYgKHZbdi5sZW5ndGggLSAxXSA9PT0gJycpIHtcbiAgICAgIHYgPSB2LnNsaWNlKDAgLCB2Lmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGRlZ0NociA9IHZbMF07XG4gICAgICAvLyBkZWdDaHIgbXVzdCBiZSBhbiBlbnRpcmUgbnVtYmVyXG4gICAgICBpZiAoZGVnQ2hyLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsgZGVnQ2hyID0gZGVnQ2hyLnNsaWNlKDAsIGRlZ0Noci5pbmRleE9mKCcuJykpOyB9XG4gICAgICAvLyBiZXR3ZWVuIC05MCAmICs5MFxuICAgICAgaWYgKE51bWJlcihkZWdDaHIpIDwgLTkwKSB7IGRlZ0NociA9ICctOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKGRlZ0NocikgPiA5MCkgeyBkZWdDaHIgPSAnOTAnOyB9XG4gICAgfVxuICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgZGVnQ2hyID0gdlswXTsgbWluQ2hyID0gdlsxXTtcbiAgICAgIGlmIChkZWdDaHIuaW5kZXhPZignLicpICE9PSAtMSkgeyBkZWdDaHIgPSBkZWdDaHIuc2xpY2UoMCwgZGVnQ2hyLmluZGV4T2YoJy4nKSk7IH1cbiAgICAgIGlmIChtaW5DaHIuaW5kZXhPZignLicpICE9PSAtMSkgeyBtaW5DaHIgPSBtaW5DaHIuc2xpY2UoMCwgZGVnQ2hyLmluZGV4T2YoJy4nKSk7IH1cbiAgICAgIGlmIChOdW1iZXIoZGVnQ2hyKSA8IC05MCkgeyBkZWdDaHIgPSAnLTkwJzsgfVxuICAgICAgaWYgKE51bWJlcihkZWdDaHIpID4gOTApIHsgZGVnQ2hyID0gJzkwJzsgfVxuICAgICAgaWYgKE51bWJlcihtaW5DaHIpIDwgLTkwKSB7IG1pbkNociA9ICctOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKG1pbkNocikgPiA5MCkgeyBtaW5DaHIgPSAnOTAnOyB9XG4gICAgICB9XG4gICAgaWYgKHYubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWdDaHIgPSB2WzBdOyBtaW5DaHIgPSB2WzFdOyBzZWNDaHIgPSB2WzJdO1xuICAgICAgaWYgKGRlZ0Noci5pbmRleE9mKCcuJykgIT09IC0xKSB7IGRlZ0NociA9IGRlZ0Noci5zbGljZSgwLCBkZWdDaHIuaW5kZXhPZignLicpKTsgfVxuICAgICAgaWYgKG1pbkNoci5pbmRleE9mKCcuJykgIT09IC0xKSB7IG1pbkNociA9IG1pbkNoci5zbGljZSgwLCBkZWdDaHIuaW5kZXhPZignLicpKTsgfVxuICAgICAgaWYgKE51bWJlcihkZWdDaHIpIDwgLTkwKSB7IGRlZ0NociA9ICctOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKGRlZ0NocikgPiA5MCkgeyBkZWdDaHIgPSAnOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKG1pbkNocikgPCAtOTApIHsgbWluQ2hyID0gJy05MCc7IH1cbiAgICAgIGlmIChOdW1iZXIobWluQ2hyKSA+IDkwKSB7IG1pbkNociA9ICc5MCc7IH1cbiAgICAgIH1cbiAgICBpZiAodi5sZW5ndGggPj0gNCkge1xuICAgICAgdiA9IHYuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoZGVnQ2hyLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsgZGVnQ2hyID0gZGVnQ2hyLnNsaWNlKDAsIGRlZ0Noci5pbmRleE9mKCcuJykpOyB9XG4gICAgICBpZiAobWluQ2hyLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsgbWluQ2hyID0gbWluQ2hyLnNsaWNlKDAsIGRlZ0Noci5pbmRleE9mKCcuJykpOyB9XG4gICAgICBpZiAoTnVtYmVyKGRlZ0NocikgPCAtOTApIHsgZGVnQ2hyID0gJy05MCc7IH1cbiAgICAgIGlmIChOdW1iZXIoZGVnQ2hyKSA+IDkwKSB7IGRlZ0NociA9ICc5MCc7IH1cbiAgICAgIGlmIChOdW1iZXIobWluQ2hyKSA8IC05MCkgeyBtaW5DaHIgPSAnLTkwJzsgfVxuICAgICAgaWYgKE51bWJlcihtaW5DaHIpID4gOTApIHsgbWluQ2hyID0gJzkwJzsgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBuYlNwYWNlcyA9IGRtc1N0ci5tYXRjaCgvXFxzL2cpLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBuYlNwYWNlcyA9IDA7XG4gICAgfVxuICAgIGlmIChuYlNwYWNlcyA9PT0gMCAmJiB2Lmxlbmd0aCA9PT0gMSnDgsKge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAobmJTcGFjZXMgPT09IDEgJiYgdi5sZW5ndGggPj0gMSkge1xuICAgICAgZGVnQ2hyID0gZGVnQ2hyLnJlcGxhY2UoJyAnLCAnJyk7XG4gICAgICBpZiAoZGVnQ2hyLnNsaWNlKGRlZ0Noci5sZW5ndGggLSAxLCBkZWdDaHIubGVuZ3RoKSAhPT0gJ8OCwrAnKSB7IGRlZ0NociArPSAnw4LCsCAnOyB9IGVsc2UgeyBkZWdDaHIgKz0gJyAnOyB9XG4gICAgfSBlbHNlIGlmIChuYlNwYWNlcyA9PT0gMiAmJiB2Lmxlbmd0aCA+PSAyKSB7XG4gICAgICBkZWdDaHIgPSBkZWdDaHIucmVwbGFjZSgnICcsICcnKTtcbiAgICAgIG1pbkNociA9IG1pbkNoci5yZXBsYWNlKCcgJywgJycpO1xuICAgICAgaWYgKGRlZ0Noci5zbGljZShkZWdDaHIubGVuZ3RoIC0gMSwgZGVnQ2hyLmxlbmd0aCkgIT09ICfDgsKwJykgeyBkZWdDaHIgKz0gJ8OCwrAgJzsgfSBlbHNlIHsgZGVnQ2hyICs9ICcgJzsgfVxuICAgICAgaWYgKG1pbkNoci5zbGljZShtaW5DaHIubGVuZ3RoIC0gMSwgbWluQ2hyLmxlbmd0aCkgIT09ICdcXCcnKSB7IG1pbkNociArPSAnXFwnICc7IH0gZWxzZSB7IG1pbkNociArPSAnICc7IH1cbiAgICB9IGVsc2UgaWYgKG5iU3BhY2VzID09PSAzICYmIHYubGVuZ3RoID49IDMpIHtcbiAgICAgIGRlZ0NociA9IGRlZ0Noci5yZXBsYWNlKCcgJywgJycpO1xuICAgICAgbWluQ2hyID0gbWluQ2hyLnJlcGxhY2UoJyAnLCAnJyk7XG4gICAgICBzZWNDaHIgPSBzZWNDaHIucmVwbGFjZSgnICcsICcnKTtcbiAgICAgIGlmIChkZWdDaHIuc2xpY2UoZGVnQ2hyLmxlbmd0aCAtIDEsIGRlZ0Noci5sZW5ndGgpICE9PSAnw4LCsCcpIHsgZGVnQ2hyICs9ICfDgsKwICc7IH0gZWxzZSB7IGRlZ0NociArPSAnICc7IH1cbiAgICAgIGlmIChtaW5DaHIuc2xpY2UobWluQ2hyLmxlbmd0aCAtIDEsIG1pbkNoci5sZW5ndGgpICE9PSAnXFwnJykgeyBtaW5DaHIgKz0gJ1xcJyAnOyB9IGVsc2UgeyBtaW5DaHIgKz0gJyAnOyB9XG4gICAgICBpZiAoc2VjQ2hyLnNsaWNlKHNlY0Noci5sZW5ndGggLSAxLCBzZWNDaHIubGVuZ3RoKSAhPT0gJ1wiJykgeyBzZWNDaHIgKz0gJ1wiJzsgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyB7IGVycm9yOiAnQ2FuXFwndCBtYW5hZ2UgaW5wdXQgc3RyaW5nLicgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVnQ2hyICsgbWluQ2hyICsgc2VjQ2hyO1xuXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG1zU3RyO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZW1wdHksIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOb21pbmF0aW1PYmplY3QgfSBmcm9tICcuLi9fbW9kZWxzL25vbWluYXRpbU9iai5tb2RlbCc7XG5pbXBvcnQgeyBPc21QbGFjZU1vZGVsIH0gZnJvbSAnLi4vX21vZGVscy9vc21QbGFjZS5tb2RlbCc7XG5pbXBvcnQgeyBpc0RlZmluZWQgfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvdXRpbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEdlb2NvZGluZ1NlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XG5cbiAgZ2VvY29kZShhZGRyZXNzOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChhZGRyZXNzID09PSBudWxsKSB7IHJldHVybiBlbXB0eSgpOyB9IC8vIEF2b2lkIHNlbmRpbmcgcmVxdWVzdCBvbiBmb3JtIHJlc2V0XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnLz9mb3JtYXQ9anNvbiZhZGRyZXNzZGV0YWlscz0xJnE9JHthZGRyZXNzfSZmb3JtYXQ9anNvbiZsaW1pdD0xMCZwb2x5Z29uX2dlb2pzb249MWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKS5waXBlKFxuICAgICAgbWFwKChvYmo6IE5vbWluYXRpbU9iamVjdCkgPT4gb2JqKVxuICAgICk7XG4gIH1cblxuICByZXZlcnNlKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3JldmVyc2U/Zm9ybWF0PWpzb24mbGF0PSR7bGF0fSZsb249JHtsbmd9JnBvbHlnb25fZ2VvanNvbj0xYDtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpLnBpcGUoXG4gICAgICBtYXAoKG9iajogTm9taW5hdGltT2JqZWN0KSA9PiBvYmopXG4gICAgKTtcbiAgfVxuXG4gIGdldFJlYWRibGVBZGRyZXNzKG9zbVBsYWNlUmVzdWx0OiBPc21QbGFjZU1vZGVsKTogc3RyaW5nIHtcbiAgICBsZXQgbG9jYWxpdHk6IHN0cmluZyA9IG51bGw7ICAgIC8vIGNpdHkgb3IgdmlsbGFnZSBvciAuLi5cbiAgICBsZXQgc3ViTG9jYWxpdHk6IHN0cmluZyA9IG51bGw7IC8vIGRpc3RyaWN0IG9yXG4gICAgbGV0IHJvYWQ6IHN0cmluZyA9IG51bGw7XG4gICAgbGV0IG5laWdoYm91cmhvb2Q6IHN0cmluZyA9IG51bGw7XG5cbiAgICAvLyBHZXQgXCJjaXR5XCIgaW5mb3JtYXRpb24gKEkgbWVhbiBjaXR5IG9yIHNvbWV0aGluZyBzaW1pbGFyIGxpa2UgdmlsbGFnZSlcbiAgICBpZiAoaXNEZWZpbmVkKG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MuY2l0eSkpIHsgbG9jYWxpdHkgPSBvc21QbGFjZVJlc3VsdC5hZGRyZXNzLmNpdHk7XG4gICAgfSBlbHNlIGlmIChpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy50b3duKSkgeyBsb2NhbGl0eSA9IG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MudG93bjtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnZpbGxhZ2UpKSB7IGxvY2FsaXR5ID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy52aWxsYWdlO1xuICAgIH0gZWxzZSBpZiAoaXNEZWZpbmVkKG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MuaGFtbGV0KSkgeyBsb2NhbGl0eSA9IG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MuaGFtbGV0OyB9XG5cbiAgICAvLyBHZXQgc3VidXJiciAmIGlmIG5vdCBkZWZpbmVkIDogcG9zdGNvZGVcbiAgICBpZiAoaXNEZWZpbmVkKG9zbVBsYWNlUmVzdWx0LmFkZHJlc3Muc3VidXJiKSAmJiBpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5wb3N0Y29kZSkgJiYgbG9jYWxpdHkgIT09IG51bGwpIHtcbiAgICAgIHN1YkxvY2FsaXR5ID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5zdWJ1cmIgKyAnLCAnICsgb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5wb3N0Y29kZTtcbiAgICB9IGVsc2UgaWYgKCFpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5zdWJ1cmIpICYmIGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnBvc3Rjb2RlKSAmJiBsb2NhbGl0eSAhPT0gbnVsbCkge1xuICAgICAgc3ViTG9jYWxpdHkgPSBvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnBvc3Rjb2RlO1xuICAgIH1cblxuICAgIC8vIEdldCBcInJvYWRcIlxuICAgIGlmIChpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5yb2FkKSkge1xuICAgICAgcm9hZCA9IG9zbVBsYWNlUmVzdWx0LmFkZHJlc3Mucm9hZDtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnBlZGVzdHJpYW4pKSB7XG4gICAgICByb2FkID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5wZWRlc3RyaWFuO1xuICAgIH1cblxuICAgIC8vIEdldCBuZWlnaGJvdXJob29kXG4gICAgaWYgKGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLm5laWdoYm91cmhvb2QpKSB7XG4gICAgICBuZWlnaGJvdXJob29kID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5uZWlnaGJvdXJob29kO1xuICAgIH1cblxuICAgIC8vIFJldHVyblxuICAgIGlmIChyb2FkICYmIG5laWdoYm91cmhvb2QgJiYgc3ViTG9jYWxpdHkgJiYgbG9jYWxpdHkpIHtcbiAgICAgIHJldHVybiByb2FkICsgJyAoJyArIG5laWdoYm91cmhvb2QgKyAnKSAnICsgc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKHJvYWQgJiYgIW5laWdoYm91cmhvb2QgJiYgc3ViTG9jYWxpdHkgJiYgbG9jYWxpdHkpIHtcbiAgICAgIHJldHVybiByb2FkICsgJyAnICsgc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKCFyb2FkICYmIG5laWdoYm91cmhvb2QgJiYgc3ViTG9jYWxpdHkgJiYgbG9jYWxpdHkpIHtcbiAgICAgIHJldHVybiBuZWlnaGJvdXJob29kICsgJyAnICsgc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKCFyb2FkICYmICFuZWlnaGJvdXJob29kICYmIHN1YkxvY2FsaXR5ICYmIGxvY2FsaXR5KSB7XG4gICAgICByZXR1cm4gc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKCFyb2FkICYmICFuZWlnaGJvdXJob29kICYmICFzdWJMb2NhbGl0eSAmJiBsb2NhbGl0eSkge1xuICAgICAgcmV0dXJuIGxvY2FsaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3NtUGxhY2VSZXN1bHQuZGlzcGxheV9uYW1lO1xuICAgIH1cblxuICB9XG5cbiAgb3NtQ2xhc3NGaWx0ZXIob3NtQ2xhc3NGaWx0ZXI6IEFycmF5PHN0cmluZz4sIG9zbVJlc3VsdHM6IEFycmF5PE5vbWluYXRpbU9iamVjdD4pIHtcbiAgICBjb25zdCBvc21GaWx0ZXJlZFJlc3VsdHM6IEFycmF5PE5vbWluYXRpbU9iamVjdD4gPSBbXTtcbiAgICBpZiAob3NtQ2xhc3NGaWx0ZXIubGVuZ3RoID4gMCAmJiBvc21SZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9zbVJlc3VsdHMuZm9yRWFjaChvc21JdGVtID0+IHtcbiAgICAgICAgbGV0IGZpbHRlck1hdGNoT2NjdXJlbmNlID0gMDtcbiAgICAgICAgbGV0IHJlbW92ZU9jY3VyZW5jZSAgID0gZmFsc2U7XG4gICAgICAgIG9zbUNsYXNzRmlsdGVyLmZvckVhY2gob3NtRmlsdGVySXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgX2NsYXNzID0gb3NtRmlsdGVySXRlbS5zcGxpdCgnOicpWzBdO1xuICAgICAgICAgIGNvbnN0IF90eXBlID0gb3NtRmlsdGVySXRlbS5zcGxpdCgnOicpWzFdO1xuICAgICAgICAgIGlmIChfdHlwZSA9PT0gJyonKSB7XG4gICAgICAgICAgICBpZiAob3NtSXRlbS5jbGFzcyA9PT0gX2NsYXNzKSB7IGZpbHRlck1hdGNoT2NjdXJlbmNlKys7IH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgISwgcmVtb3ZlXG4gICAgICAgICAgICBpZiAoX3R5cGUuc3Vic3RyKDAsIDEpID09PSAnIScpIHtcbiAgICAgICAgICAgICAgaWYgKG9zbUl0ZW0uY2xhc3MgPT09IF9jbGFzcyAmJiAnIScgKyBvc21JdGVtLnR5cGUgPT09IF90eXBlKSB7IHJlbW92ZU9jY3VyZW5jZSA9IHRydWU7IH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChvc21JdGVtLmNsYXNzID09PSBfY2xhc3MgJiYgb3NtSXRlbS50eXBlID09PSBfdHlwZSkgeyBmaWx0ZXJNYXRjaE9jY3VyZW5jZSsrOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpbHRlck1hdGNoT2NjdXJlbmNlID4gMCAmJiAhcmVtb3ZlT2NjdXJlbmNlKSB7XG4gICAgICAgICAgb3NtRmlsdGVyZWRSZXN1bHRzLnB1c2gob3NtSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9mKG9zbUZpbHRlcmVkUmVzdWx0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZihvc21SZXN1bHRzKTtcbiAgICB9XG4gIH1cblxuICByZXZlcnNlQ29ycmRpbmF0ZXNBcnJheShjb29yZGluYXRlc0FycmF5OiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikge1xuICAgIGlmIChjb29yZGluYXRlc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvb3JkaW5hdGVzQXJyYXkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5yZXZlcnNlKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb29yZGluYXRlc0FycmF5O1xuICAgIH1cbiAgfVxuXG4gIHNpbXBsaWZ5UG9seWxpbmUoY29vcmRpbmF0ZXNBcnJheTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4pOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgaWYgKGNvb3JkaW5hdGVzQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgZmlyc3RDb29yZGluYXRlID0gY29vcmRpbmF0ZXNBcnJheVswXTtcbiAgICAgIGNvbnN0IGxhc3RDb29yZGluYXRlID0gY29vcmRpbmF0ZXNBcnJheVtjb29yZGluYXRlc0FycmF5Lmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIFtmaXJzdENvb3JkaW5hdGUsIGxhc3RDb29yZGluYXRlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzQXJyYXk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEVsZXZhdGlvblNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XG5cbiAgZ2V0RWxldmF0aW9uKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgY29uc3QgYXBpVXJsID0gYGh0dHBzOi8vYXBpLm9wZW4tZWxldmF0aW9uLmNvbS9hcGkvdjEvbG9va3VwP2xvY2F0aW9ucz0ke2xhdH0sJHtsbmd9YDtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlVcmwpLnBpcGUoXG4gICAgICBtYXAoKG9iajogT3BlbkVsZXZhdGlvbkFwaU9iamVjdCkgPT4gb2JqLnJlc3VsdHNbMF0uZWxldmF0aW9uKVxuICAgICk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE9wZW5FbGV2YXRpb25BcGlPYmplY3Qge1xuICByZXN1bHRzOiBBcnJheTx7XG4gICAgZWxldmF0aW9uOiBudW1iZXIsXG4gICAgbGF0aXR1ZGU6IG51bWJlcixcbiAgICBsb25naXR1ZGU6IG51bWJlclxuICB9Pjtcbn1cbiIsIi8qKlxuICogQHRvZG8gbGltaXQgcG9seWdvbiBhcmVhIC8gcG9seWxpbmUgbGVuZ2h0XG4gKiBAdG9kbyBmaXggZm9ybSBpbnB1dCBub3QgdXBkYXRlZCBhZnRlciAuc2V0VmFsdWUgKGV4Y2VwdCBmb3IgdGhlIGdwc01hcmtlclNldFZhbHVlcyBtZXRob2QpXG4gKiBzZWUgOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9tYXRlcmlhbDIvaXNzdWVzLzc2MDEjaXNzdWVjb21tZW50LTMzNDk0NzI4MCxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvMjQzNCxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvMjM2MyxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9wdWxsLzI0NTUsXG4gKiAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9tYXRlcmlhbDIvaXNzdWVzLzI4MzcjaXNzdWVjb21tZW50LTI3NjUzODYxNixcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvNzYwMSxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvMjQ0MVxuICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0ICdsZWFmbGV0LWRyYXcnO1xuaW1wb3J0IHsgTGF0TG5nRXhwcmVzc2lvbiB9IGZyb20gJ2xlYWZsZXQnO1xuXG5pbXBvcnQgeyBHZW9Qb2ludCB9IGZyb20gJy4uL19oZWxwZXJzL2dlb0NvbnZlcnQnO1xuaW1wb3J0ICogYXMgbGVhZmxldE9iamVjdHMgZnJvbSAnLi4vX2hlbHBlcnMvbGVhZmxldE9iamVjdHMnO1xuaW1wb3J0IHsgZG1zRm9ybWF0dGVyIH0gZnJvbSAnLi4vX2hlbHBlcnMvZG1zVG9vbHMnO1xuXG5pbXBvcnQgeyBHZW9jb2RpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEVsZXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9fc2VydmljZXMvZWxldmF0aW9uLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBMb2NhdGlvbk1vZGVsIH0gZnJvbSAnLi4vX21vZGVscy9sb2NhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBOb21pbmF0aW1PYmplY3QgfSBmcm9tICcuLi9fbW9kZWxzL25vbWluYXRpbU9iai5tb2RlbCc7XG5pbXBvcnQgeyBMYXRMbmdETVNBbHRpdHVkZVBob3RvTmFtZSB9IGZyb20gJy4uL19tb2RlbHMvZ3BzTGF0TG5nJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGItZ2VvbG9jLW1hcCcsXG4gIHRlbXBsYXRlOiBgPGgxPk/Dg8K5ID88L2gxPlxuICBcbjxkaXYgaWQ9XCJnZW9sb2MtbWFwXCI+XG4gIDxkaXYgaWQ9XCJnZW9sb2MtbWFwLW1ldGFcIj5cbiAgICA8IS0tIGdlb3NlYXJjaCBhdXRvY29tcGxldGUgLS0+XG4gICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImdlb1NlYXJjaEZvcm1Hcm91cC5jb250cm9scy5wbGFjZUlucHV0XCIgcGxhY2Vob2xkZXI9XCJUcm91dmVyIHVuIGxpZXVcIiBhcmlhLWxhYmVsPVwiVHJvdXZlciB1biBsaWV1XCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJpc0xvYWRpbmdBZGRyZXNzXCIgZGlhbWV0ZXI9XCIyMFwiIG1hdFN1ZmZpeD48L21hdC1zcGlubmVyPlxuICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwiYWRkcmVzc1NlbGVjdGVkQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBhZGRyZXNzIG9mIGdlb1NlYXJjaFJlc3VsdHNcIiBbdmFsdWVdPVwiYWRkcmVzc1wiPlxuICAgICAgICAgIDxzcGFuPnt7IGFkZHJlc3MgfCBvc21QbGFjZVJlYWRhYmxlQWRkcmVzcyB9fTwvc3Bhbj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cImdlb2xvY2F0aW9uSW5wdXRzXCI+XG4gICAgICA8ZGl2IFtmb3JtR3JvdXBdPVwibGF0bG5nRm9ybUdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXRMbmdNZW51SW5wdXRzXCI+XG4gICAgICAgICAgPCEtLSBsYXRpdHVkZSAvIGxvbmdpdHVkZSBkZWNpbWFsIGZvcm1hdCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29vcmRGb3JtYXQ9PSdkZWNpbWFsJ1wiPlxuICAgICAgICAgICAgPCEtLSBsYXRpdHVkZSAvIGxvbmdpdHVkZSBmb3JtYXQgc2VsZWN0aW9uIC0tPiAgXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJsYXRJbnB1dFwiIHBsYWNlaG9sZGVyPVwibGF0aXR1ZGVcIj5cbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nTGF0aXR1ZGVcIiBkaWFtZXRlcj1cIjIwXCIgbWF0U3VmZml4PjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuZGlydHkgJiYgbGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxhdElucHV0Lmhhc0Vycm9yKCdtYWxmb3JtZWRMYXRMbmdEZWNGb3JtYXQnKVwiPkZvcm1hdCBub24gdmFsaWRlPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibG5nSW5wdXRcIiBwbGFjZWhvbGRlcj1cImxvbmdpdHVkZVwiPlxuICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJpc0xvYWRpbmdMb25naXR1ZGVcIiBkaWFtZXRlcj1cIjIwXCIgbWF0U3VmZml4PjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuZGlydHkgJiYgbGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxhdElucHV0Lmhhc0Vycm9yKCdtYWxmb3JtZWRMYXRMbmdEZWNGb3JtYXQnKVwiPkZvcm1hdCBub24gdmFsaWRlPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkTWFya2VyRnJvbUxhdExuZ0Nvb3JkKCk7IGNhbGxHZW9sb2NFbGV2YXRpb25BcGlzVXNpbmdMYXRMbmdJbnB1dHNWYWx1ZXMoKTtcIiBbZGlzYWJsZWRdPVwiIWxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC52YWxpZCB8fCAhbGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnZhbGlkXCIgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRUb29sdGlwPVwiVXRpbGlzZXIgY2VzIGNvb3Jkb25uw4PCqWVzXCI+d2hlcmVfdG9fdm90ZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBtZW51IGZvcm1hdCBkZWNpbWFsIC8gZG1zLS0+XG4gICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNldExhdExuZ0lucHV0Rm9ybWF0KCdkbXMnKVwiPkRlZ3LDg8KpcyBtaW51dGVzIHNlY29uZGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzZXRMYXRMbmdJbnB1dEZvcm1hdCgnZGVjaW1hbCcpXCI+RMODwqljaW1hbDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1tZW51PlxuXG4gICAgICAgIDwhLS0gbGF0aXR1ZGUgLyBsb25naXR1ZGUgRE1TIGZvcm1hdCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvb3JkRm9ybWF0PT0nZG1zJ1wiPlxuICAgICAgICAgIDwhLS0gbGF0aXR1ZGUgLyBsb25naXR1ZGUgZm9ybWF0IHNlbGVjdGlvbiAtLT4gIFxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCI+XG4gICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkbXNMYXRJbnB1dFwiIHBsYWNlaG9sZGVyPVwiKGRlZynDgsKwICAobWluKScgIChzZWMpJnF1b3Q7XCI+XG4gICAgICAgICAgICA8c3BhbiBtYXRQcmVmaXg+TiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ0xhdGl0dWRlXCIgZGlhbWV0ZXI9XCIyMFwiIG1hdFN1ZmZpeD48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5kaXJ0eSAmJiBsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuaGFzRXJyb3IoJ21hbGZvcm1lZExhdExuZ0Rtc0Zvcm1hdCcpXCI+Rm9ybWF0IG5vbiB2YWxpZGU8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRtc0xuZ0lucHV0XCIgcGxhY2Vob2xkZXI9XCIoZGVnKcOCwrAgIChtaW4pJyAgKHNlYykmcXVvdDtcIj5cbiAgICAgICAgICAgIDxzcGFuIG1hdFByZWZpeD5FJm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nTG9uZ2l0dWRlXCIgZGlhbWV0ZXI9XCIyMFwiIG1hdFN1ZmZpeD48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5kaXJ0eSAmJiBsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuaGFzRXJyb3IoJ21hbGZvcm1lZExhdExuZ0Rtc0Zvcm1hdCcpXCI+Rm9ybWF0IG5vbiB2YWxpZGU8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZE1hcmtlckZyb21EbXNDb29yZCgpOyBjYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKCk7XCIgW2Rpc2FibGVkXT1cIiFsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQudmFsaWQgfHwgIWxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC52YWxpZFwiIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIG1hdFRvb2x0aXA9XCJVdGlsaXNlciBjZXMgY29vcmRvbm7Dg8KpZXNcIj53aGVyZV90b192b3RlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDwhLS0gZWxldmF0aW9uIC0tPlxuICAgICAgPGRpdiBbZm9ybUdyb3VwXT1cImVsZXZhdGlvbkZvcm1Hcm91cFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImVsZXZhdGlvbklucHV0XCIgcGxhY2Vob2xkZXI9XCJhbHRpdHVkZVwiPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ0VsZXZhdGlvblwiIGRpYW1ldGVyPVwiMjBcIiBtYXRTdWZmaXg+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0xvYWRpbmdFbGV2YXRpb25cIiBtYXRTdWZmaXg+bTwvc3Bhbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGlkPVwiZ2VvbG9jLW1hcC1kcmF3XCIgc3R5bGU9XCJoZWlnaHQ6IDQwMHB4O1wiXG4gICAgICBsZWFmbGV0IFxuICAgICAgW2xlYWZsZXRPcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgKGxlYWZsZXRNYXBSZWFkeSk9XCJvbk1hcFJlYWR5KCRldmVudClcIj5cbiAgPC9kaXY+XG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgW2hpZGRlbl17ZGlzcGxheTpub25lIWltcG9ydGFudH0jZ2VvbG9jLW1hcHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi1oZWlnaHQ6MjAwcHh9I2dlb2xvYy1tYXAgI2dlb2xvYy1tYXAtbWV0YXtmbGV4OjE7cGFkZGluZzoxNXB4fSNnZW9sb2MtbWFwICNnZW9sb2MtbWFwLW1ldGEgLmdlb2xvY2F0aW9uSW5wdXRze2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59I2dlb2xvYy1tYXAgI2dlb2xvYy1tYXAtZHJhd3twb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjN9I2dlb2xvYy1tYXAgI2h0dHBUYXNrc1J1bm5pbmdTcGlubmVye2ZsZXg6MX1idXR0b24gLm1pbml7bWluLXdpZHRoOjA7bGluZS1oZWlnaHQ6MzBweH0uZ2VvbG9jYXRlZFBob3RvTWV0YWRhdGFUYWJsZXt3aWR0aDoxMDAlfWBdXG59KVxuZXhwb3J0IGNsYXNzIE1hcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLVxuICAvLyBJTlBVVCAvIE9VVFBVVFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuICBASW5wdXQoKSBsYXllcnNUb0FkZDogQXJyYXk8c3RyaW5nPiA9IFsnb3NtJ107XG4gIEBJbnB1dCgpIGdlb2xvY2F0ZWRQaG90b0xhdExuZzogT2JzZXJ2YWJsZTxBcnJheTxMYXRMbmdETVNBbHRpdHVkZVBob3RvTmFtZT4+O1xuICBASW5wdXQoKSBvc21DbGFzc0ZpbHRlcjogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIEBPdXRwdXQoKSBsb2NhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8TG9jYXRpb25Nb2RlbD4oKTsgLy8gb2JqZWN0IHRvIHJldHVyblxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRk9STVMgJiBSRUxBVEVEIFZBUklBQkxFU1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGxhdGxuZ0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuICBlbGV2YXRpb25Gb3JtR3JvdXA6IEZvcm1Hcm91cDtcbiAgZ2VvU2VhcmNoRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gIGdlb1NlYXJjaFJlc3VsdHM6IEFycmF5PE5vbWluYXRpbU9iamVjdD47XG4gIGNvb3JkRm9ybWF0ID0gJ2Rtcyc7ICAgICAgICAgICAgLy8gJ2RlY2ltYWwnIHwgJ2RtcydcblxuICAvLyAtLS0tLS0tLS1cbiAgLy8gVkFSSUFCTEVTXG4gIC8vIC0tLS0tLS0tLVxuICBfbG9jYXRpb24gPSA8TG9jYXRpb25Nb2RlbD57fTtcbiAgZ2VvbG9jYXRlZFBob3RvTGF0TG5nRGF0YTogQXJyYXk8TGF0TG5nRE1TQWx0aXR1ZGVQaG90b05hbWU+ID0gW107XG4gIGdlb2xvY2F0ZWRQaG90b0xhdExuZ0Rpc3BsYXllZENvbHVtbnNUYWJsZTogQXJyYXk8c3RyaW5nPiA9IFsnc2VsZWN0JywgJ3Bob3RvTmFtZScsICdsYXQnLCAnbG5nJywgJ2FsdGl0dWRlJ107XG4gIGlzTG9hZGluZ0FkZHJlc3MgPSBmYWxzZTtcbiAgaXNMb2FkaW5nTGF0aXR1ZGUgPSBmYWxzZTtcbiAgaXNMb2FkaW5nTG9uZ2l0dWRlID0gZmFsc2U7XG4gIGlzTG9hZGluZ0VsZXZhdGlvbiA9IGZhbHNlO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS1cbiAgLy8gU1VCU0NSSVBUSU9OU1xuICAvLyAtLS0tLS0tLS0tLS0tXG4gIGdlb1NlYXJjaFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb247XG4gIGxhdERtc0lucHV0U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbjtcbiAgbG5nRG1zSW5wdXRTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTEVBRkxFVCBWQVJJQUJMRVMsIExBWUVSUyBBTkQgTUFQIENPTkZJR1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgbWFwOiBMLk1hcDtcbiAgcHVibGljIG1hcExhdCA9IDA7XG4gIHB1YmxpYyBtYXBMbmcgPSAwO1xuICBwcml2YXRlIGRyYXdUeXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgZHJhd25JdGVtOiBhbnk7XG5cbiAgcHJpdmF0ZSBvc21MYXllciA9IEwudGlsZUxheWVyKCdodHRwOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywgeyBtYXhab29tOiAxOCwgYXR0cmlidXRpb246ICdPcGVuIFN0cmVldCBtYXAnIH0pO1xuICBwcml2YXRlIGdvb2dsZVNhdGVsbGl0ZUxheWVyID0gTC50aWxlTGF5ZXIoJ2h0dHA6Ly97c30uZ29vZ2xlLmNvbS92dC9seXJzPXMmeD17eH0meT17eX0mej17en0nLCB7IG1heFpvb206IDIwLCBzdWJkb21haW5zOiBbJ210MCcsICdtdDEnLCAnbXQyJywgJ210MyddLCBhdHRyaWJ1dGlvbjogJ0dvb2dsZSBtYXBzJyB9KTtcbiAgcHJpdmF0ZSBnb29nbGVIeWJyaWRMYXllciA9IEwudGlsZUxheWVyKCdodHRwOi8ve3N9Lmdvb2dsZS5jb20vdnQvbHlycz1zLGgmeD17eH0meT17eX0mej17en0nLCB7IG1heFpvb206IDIwLCBzdWJkb21haW5zOiBbJ210MCcsICdtdDEnLCAnbXQyJywgJ210MyddLCBhdHRyaWJ1dGlvbjogJ0dvb2dsZSBtYXBzJyB9KTtcbiAgcHJpdmF0ZSBicmdtTGF5ZXIgPSBMLnRpbGVMYXllci53bXMoJ2h0dHA6Ly9nZW9zZXJ2aWNlcy5icmdtLmZyL2dlb2xvZ2llJywgeyB2ZXJzaW9uOiAnMS4zLjAnLCBsYXllcnM6ICdHZW9sb2dpZSd9KTtcbiAgcHJpdmF0ZSBtYXBMYXllcnMgPSB7XG4gICAgJ0dvb2dsZSc6IHRoaXMuZ29vZ2xlSHlicmlkTGF5ZXIsXG4gICAgJ09TTSc6IHRoaXMub3NtTGF5ZXIsXG4gICAgJ0JSR00nOiB0aGlzLmJyZ21MYXllclxuICB9O1xuICBwcml2YXRlIGdlb1Jlc3VsdHNMYXllciA9IEwuZ2VvSlNPTihudWxsLCB7c3R5bGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4geyBjb2xvcjogJyNmZjc4MDAnLCB3ZWlnaHQ6IDUsIG9wYWNpdHk6IDAuNjUgfTsgfX0pO1xuICBwcml2YXRlIGdlb2xvY2F0ZWRQaG90b0xhdExuZ0xheWVyID0gTC5nZW9KU09OKCk7XG5cbiAgLy8gbWFwIG9wdGlvbnNcbiAgb3B0aW9ucyA9IHtcbiAgICBsYXllcnM6IFsgdGhpcy5vc21MYXllciBdLFxuICAgIHpvb206IDQsXG4gICAgY2VudGVyOiBMLmxhdExuZyh7IGxhdDogNDYuNTU4ODYwMzAzMTE3MTksIGxuZzogMi45ODgyODEyNTAwMDAwMDA0IH0pXG4gIH07XG5cbiAgLy8gTGVhZmxldCBtYXAgY29uZmlndXJhdGlvblxuICBkcmF3bkl0ZW1zID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7ICAvLyBhbGwgZHJhd24gaXRlbXNcbiAgZHJhd0NvbnRyb2xGdWxsID0gbGVhZmxldE9iamVjdHMuZHJhd0NvbnRyb2xQYW5lbDsgICAgICAvLyBkcmF3IHBhbmVsXG4gIGRyYXdDb250cm9sRWRpdCA9IGxlYWZsZXRPYmplY3RzLmRyYXdDb250cm9sRWRpdFBhbmVsKHRoaXMuZHJhd25JdGVtcyk7ICAvLyBlZGl0IHBhbmVsXG4gIGNpcmNsZU1hcmtlck9wdCA9IGxlYWZsZXRPYmplY3RzLmNpcmNsZU1hcmtlclN0eWxlOyAgICAgLy8gbWFya2VyIG9wdGlvbnNcbiAgZ2VvUmVzdWx0c09wdCA9IGxlYWZsZXRPYmplY3RzLmNpdHlTdHlsZTtcblxuXG5cbiAgLy8gLS0tLVxuICAvLyBDT0RFXG4gIC8vIC0tLS1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGdlb2NvZGVTZXJ2aWNlOiBHZW9jb2RpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxldmF0aW9uU2VydmljZTogRWxldmF0aW9uU2VydmljZSkgeyB9XG5cbiAgLyoqXG4gICAqIC0gQ3JlYXRlIHRoZSBmb3Jtc1xuICAgKiAtIFNldCB1cCBzdWJzY3JpcHRpb25zIChnZW8gc2VhcmNoLCBnZW9sb2NhdGVkIHBob3RvcywgbGF0IC8gbG5nIGlucHV0cylcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIENyZWF0ZSBmb3Jtc1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBsYXRJbnB1dDogdGhpcy5mYi5jb250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5sYXRMbmdEZWNWYWxpZGF0b3JdKSxcbiAgICAgIGxuZ0lucHV0OiB0aGlzLmZiLmNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmxhdExuZ0RlY1ZhbGlkYXRvcl0pLFxuICAgICAgZG1zTGF0SW5wdXQ6IHRoaXMuZmIuY29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMubGF0TG5nRG1zVmFsaWRhdG9yXSksXG4gICAgICBkbXNMbmdJbnB1dDogdGhpcy5mYi5jb250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5sYXRMbmdEbXNWYWxpZGF0b3JdKVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGV2YXRpb25Gb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGVsZXZhdGlvbklucHV0OiB0aGlzLmZiLmNvbnRyb2woJycsIG51bGwpXG4gICAgfSk7XG5cbiAgICB0aGlzLmdlb1NlYXJjaEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgcGxhY2VJbnB1dDogdGhpcy5mYi5jb250cm9sKCcnLCBudWxsKVxuICAgIH0pO1xuXG4gICAgLy8gV2F0Y2ggcGxhY2VJbnB1dCBjaGFuZ2VzXG4gICAgdGhpcy5nZW9TZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLmdlb1NlYXJjaEZvcm1Hcm91cC5jb250cm9scy5wbGFjZUlucHV0LnZhbHVlQ2hhbmdlc1xuICAgIC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDQwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvY29kZVNlcnZpY2UuZ2VvY29kZSh2YWx1ZSk7XG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gZmFsc2U7XG4gICAgICAvLyBmaWx0ZXIgcmVzdWx0cyBpZiBuZWVkZWRcbiAgICAgIGlmICh0aGlzLm9zbUNsYXNzRmlsdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5nZW9jb2RlU2VydmljZS5vc21DbGFzc0ZpbHRlcih0aGlzLm9zbUNsYXNzRmlsdGVyLCByZXN1bHRzKS5zdWJzY3JpYmUoZmlsdGVyZWRSZXN1bHRzID0+IHtcbiAgICAgICAgICB0aGlzLmdlb1NlYXJjaFJlc3VsdHMgPSBmaWx0ZXJlZFJlc3VsdHM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZW9TZWFyY2hSZXN1bHRzID0gcmVzdWx0cztcbiAgICAgIH1cbiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgIC8vIEB0b3RvIG1hbmFnZSBlcnJvclxuICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICAvLyBXYXRjaCBnZW9sb2NhdGVkIHBob3RvIGlucHV0IGNoYW5nZXNcbiAgICB0aGlzLmdlb2xvY2F0ZWRQaG90b0xhdExuZy5zdWJzY3JpYmUocGhvdG9MYXRMbmcgPT4ge1xuICAgICAgLy8gQHRvZG8gY2xlYXIgdGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdMYXllclxuXG4gICAgICB0aGlzLmdlb2xvY2F0ZWRQaG90b0xhdExuZ0RhdGEgPSBwaG90b0xhdExuZztcblxuICAgICAgLy8gRm9yIGVhY2ggZ2VvbG9jYXRlZCBwaG90bywgYWRkIG1hcmtlciBhbmQgYmluZCBtb3VzZSBldmVudCBvbiB0aG9zZXMgbWFya2Vyc1xuICAgICAgdGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdEYXRhLmZvckVhY2goZGF0YSA9PiB7XG4gICAgICAgIC8vIEdldCBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIChnZW9sb2NhdGVkIGRhdGEgYXJlIGluIERNUyBmb3JtYXQpXG4gICAgICAgIGNvbnN0IF9sYXREbXMgPSBkYXRhLmxhdC5kZWcgKyAnw4LCsCAnICsgZGF0YS5sYXQubWluICsgJ1xcJycgKyBkYXRhLmxhdC5zZWMgKyAnXCInO1xuICAgICAgICBjb25zdCBfbG5nRG1zID0gZGF0YS5sbmcuZGVnICsgJ8OCwrAgJyArIGRhdGEubG5nLm1pbiArICdcXCcnICsgZGF0YS5sbmcuc2VjICsgJ1wiJztcbiAgICAgICAgY29uc3QgZyA9IG5ldyBHZW9Qb2ludChfbG5nRG1zLCBfbGF0RG1zKTtcbiAgICAgICAgZGF0YS5sYXREZWMgPSBnLmxhdERlYztcbiAgICAgICAgZGF0YS5sbmdEZWMgPSBnLmxvbkRlYztcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIG1hcmtlclxuICAgICAgICBjb25zdCBsYXRMbmcgPSBMLmxhdExuZyhkYXRhLmxhdERlYywgZGF0YS5sbmdEZWMpO1xuICAgICAgICBjb25zdCBncHNQaG90b01hcmtlciA9IG5ldyBMLk1hcmtlcihsYXRMbmcsIHsgaWNvbjogbGVhZmxldE9iamVjdHMuZ3BzUGhvdG9NYXJrZXJJY29uKCkgfSk7XG4gICAgICAgIC8vIE1hcmtlciBwb3B1cFxuICAgICAgICBjb25zdCBodG1sID0gYFxuICAgICAgICAgIDxiPkZpY2hpZXIgXCIke2RhdGEucGhvdG9OYW1lfVwiPC9iPjxicj5cbiAgICAgICAgICBMYXQuIDogJHtnLmxhdERlZ308YnIgLz5cbiAgICAgICAgICBMbmcuIDogJHtnLmxvbkRlZ308YnIgLz5cbiAgICAgICAgICBBbHQuIDogJHtkYXRhLmFsdGl0dWRlfSBtPGJyIC8+PGJyIC8+XG4gICAgICAgICAgPGI+Q2xpcXVleiBzdXIgbGUgcG9pbnQgcG91ciB1dGlsaXNlciBjZXMgY29vcmRvbm7Dg8KpZXM8L2I+YDtcbiAgICAgICAgZ3BzUGhvdG9NYXJrZXIuYmluZFBvcHVwKGh0bWwpLm9wZW5Qb3B1cCgpO1xuICAgICAgICAvLyBNYXJrZXIgbW91c2UgZXZlbnRzXG4gICAgICAgIGdwc1Bob3RvTWFya2VyLm9uKCdjbGljaycsIChldmVudCA9PiB7IHRoaXMuZ3BzTWFya2VyU2V0VmFsdWVzKGRhdGEubGF0RGVjLCBkYXRhLmxuZ0RlYywgZGF0YS5hbHRpdHVkZSk7IH0pKTtcbiAgICAgICAgZ3BzUGhvdG9NYXJrZXIub24oJ21vdXNlb3ZlcicsIChldmVudCkgPT4geyBncHNQaG90b01hcmtlci5vcGVuUG9wdXAoKTsgfSk7XG4gICAgICAgIGdwc1Bob3RvTWFya2VyLm9uKCdtb3VzZW91dCcsIChldmVudCA9PiB7IGdwc1Bob3RvTWFya2VyLmNsb3NlUG9wdXAoKTsgfSkpO1xuICAgICAgICAvLyBBZGQgdGhlIG1hcmtlciB0byB0aGUgbWFwXG4gICAgICAgIGdwc1Bob3RvTWFya2VyLmFkZFRvKHRoaXMuZ2VvbG9jYXRlZFBob3RvTGF0TG5nTGF5ZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEZpdCBtYXAgdG8gZ2VvbG9jYXRlZCBwaG90b3MgbWFya2Vyc1xuICAgICAgdGhpcy5mbHlUb0dlb2xvY2F0ZWRQaG90b0l0ZW1zKCk7XG4gICAgfSk7XG5cbiAgICAvLyBXYXRjaCBsYXQgJiBsbmcgRE1TIGlucHV0cyBjaGFuZ2VzIGFuZCBzZXQgdXAgdGhlIERNUyBmb3JtYXR0ZXJcbiAgICAvLyBUaGUgRE1TIGZvcm1hdHRlciByZXN0cmljdHMgdGhlIGtleWJvYXJkIGlucHV0IG9mIHRoZSB1c2VyIDogb25seSBudW1iZXIsIGNvbW1hLCBkb3QgYW5kICctJywgZGVnIGFuZCBtaW4gbXVzdCBiZSBiZXR3ZWVuIC05MCBhbmQgKzkwXG4gICAgLy8gVGhlIGZvcm1hdHRlciBhdXRvIGZpbGwgdGhlIMOCwrAgJyBhbmQgXCIgY2hhcmFjdGVycyB0byBoZWxwIHRoZSB1c2VyIGlucHV0XG4gICAgdGhpcy5sYXREbXNJbnB1dFN1YnNjcmlwdGlvbiA9IHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xhdElucHV0LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuc2V0VmFsdWUoZG1zRm9ybWF0dGVyKHZhbHVlKSwgeyBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfSk7XG4gICAgdGhpcy5sbmdEbXNJbnB1dFN1YnNjcmlwdGlvbiA9IHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xuZ0lucHV0LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTG5nSW5wdXQuc2V0VmFsdWUoZG1zRm9ybWF0dGVyKHZhbHVlKSwgeyBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZ2VvU2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5sYXREbXNJbnB1dFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG5nRG1zSW5wdXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbGF5ZXJzIGFuZCBldmVudHMgbGlzdGVuZXJzXG4gICAqL1xuICBvbk1hcFJlYWR5KG1hcDogTC5NYXApIHtcbiAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB0aGlzLm1hcC5hZGRDb250cm9sKEwuY29udHJvbC5sYXllcnMobnVsbCwgdGhpcy5tYXBMYXllcnMsIHsgcG9zaXRpb246ICd0b3ByaWdodCd9KSk7XG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIodGhpcy5kcmF3bkl0ZW1zKTtcbiAgICB0aGlzLm1hcC5hZGRMYXllcih0aGlzLmdlb1Jlc3VsdHNMYXllcik7XG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIodGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdMYXllcik7XG4gICAgdGhpcy5tYXAuYWRkQ29udHJvbCh0aGlzLmRyYXdDb250cm9sRnVsbCk7XG4gICAgdGhpcy5tYXAub24oJ2RyYXc6Y3JlYXRlZCcsIChlKSA9PiB7XG4gICAgICB0aGlzLmRyYXduSXRlbSA9IGVbJ2xheWVyJ107XG4gICAgICB0aGlzLmRyYXdUeXBlID0gZVsnbGF5ZXJUeXBlJ107XG4gICAgICAvLyBJZiBpdCdzIGEgbWFya2VyLCBpdCBtdXN0IGJlIGRyYWdnYWJsZS4gQnkgZGVmYXVsdCwgbGVhZmxldC5kcmF3IG1vZHVsZSBkb2VzIG5vdCBwcm92aWRlIGEgZHJhZ2dhYmxlIG1hcmtlclxuICAgICAgLy8gU28sIHdlIGRvbid0IGRvIGEgdGhpcy5kcmF3bkl0ZW1zLmFkZExheWVyKGxheWVyKTtcbiAgICAgIC8vIFdlIGp1c3QgZHJhdyBhIG5ldyBkcmFnZ2FibGVNYXJrZXIgaW5zdGVhZFxuICAgICAgaWYgKHRoaXMuZHJhd1R5cGUgPT09ICdtYXJrZXInKSB7XG4gICAgICAgIGNvbnN0IGxhdGxuZyA9IHRoaXMuZHJhd25JdGVtLl9sYXRsbmc7XG4gICAgICAgIGxlYWZsZXRPYmplY3RzLmRyYWdnYWJsZU1hcmtlcihsYXRsbmcubGF0LCBsYXRsbmcubG5nLCAoZHJhZ0VuZCkgPT4geyB0aGlzLmNhbGxHZW9sb2NFbGV2YXRpb25BcGlzVXNpbmdMYXRMbmdJbnB1dHNWYWx1ZXMoKTsgfSkuYWRkVG8odGhpcy5kcmF3bkl0ZW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJhd25JdGVtcy5hZGRMYXllcih0aGlzLmRyYXduSXRlbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgLyBoaWRlIGNvbnRyb2wgcGFuZWxzXG4gICAgICAvLyBpZiBPTkUgaXRlbSBpcyBkcmF3biwgc2V0IHBsYWNlIGFuZCBlbGV2YXRpb24gaW5wdXRzIChjYWxsIEFQSSlcbiAgICAgIGlmICh0aGlzLmRyYXduSXRlbXMuZ2V0TGF5ZXJzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNldE1hcEVkaXRNb2RlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3bkl0ZW1zLmdldExheWVycygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0aGlzLmNhbGxHZW9sb2NFbGV2YXRpb25BcGlzVXNpbmdMYXRMbmdJbnB1dHNWYWx1ZXMoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mbHlUb0RyYXduSXRlbXMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMubWFwLm9uKCdkcmF3OmVkaXRlZCcsIChlKSA9PiB7XG4gICAgICB0aGlzLmRyYXduSXRlbSA9IGVbJ2xheWVyJ107XG4gICAgICB0aGlzLmRyYXdUeXBlID0gZVsnbGF5ZXJUeXBlJ107XG5cbi8vICAgICAgdGhpcy5kcmF3bkl0ZW1zLmFkZExheWVyKHRoaXMuZHJhd25JdGVtKTtcblxuICAgICAgaWYgKHRoaXMuZHJhd25JdGVtcy5nZXRMYXllcnMoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdGhpcy5jYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmx5VG9EcmF3bkl0ZW1zKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5vbignZHJhdzpkZWxldGVkJywgKGUpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJHZW9SZXN1bHRzTGF5ZXIoKTtcbiAgICAgIHRoaXMuY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTtcbiAgICAgIHRoaXMuc2V0TWFwRHJhd01vZGUoKTtcbiAgICAgIHRoaXMuY2xlYXJGb3JtKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZHJhd01hcCgxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIG1hcCBwYXJlbnQncyBkaXYgc2l6ZSBjaGFuZ2UgKGVnLiBwYW5lbCB3aWR0aCksIGhhdmUgdG8gcmVkcmF3IHRoZSBtYXBcbiAgICogU29tZXRpbWVzICh3aGVuIG9wZW5pbmcgLyBjbG9zaW5nIGEgdGFiKSwgc2l6ZSBjaGFuZ2UgaXMgZGV0ZWN0ZWQgdG9vIGVhcmxpZXIsIG5lZWQgdG8gc2V0IGEgZGVsYXkgKGFib3V0IDEwLTEwMG1zIHNlZW1zIHRvIGJlIGNvbnZlbmllbnQpXG4gICAqL1xuICByZWRyYXdNYXAoZGVsYXk/OiBudW1iZXIpIHtcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMubWFwLmludmFsaWRhdGVTaXplKCksIGRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXAuaW52YWxpZGF0ZVNpemUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0aGUgXCJlZGl0XCIgdG9vbGJhciBpbnNpZGUgbWFwXG4gICAqL1xuICBzZXRNYXBFZGl0TW9kZSgpIHtcbiAgICB0aGlzLm1hcC5yZW1vdmVDb250cm9sKHRoaXMuZHJhd0NvbnRyb2xGdWxsKTtcbiAgICB0aGlzLm1hcC5hZGRDb250cm9sKHRoaXMuZHJhd0NvbnRyb2xFZGl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBcImRyYXdcIiB0b29sYmFyIGluc2lkZSBtYXBcbiAgICovXG4gIHNldE1hcERyYXdNb2RlKCkge1xuICAgIHRoaXMubWFwLnJlbW92ZUNvbnRyb2wodGhpcy5kcmF3Q29udHJvbEVkaXQpO1xuICAgIHRoaXMubWFwLmFkZENvbnRyb2wodGhpcy5kcmF3Q29udHJvbEZ1bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXAgYm91bmRzIHRvIGRyYXduIGl0ZW1zXG4gICAqL1xuICBmbHlUb0RyYXduSXRlbXMoX21heFpvb20gPSAxNCkge1xuICAgIGNvbnN0IGIgPSB0aGlzLmRyYXduSXRlbXMuZ2V0Qm91bmRzKCk7XG4gICAgdGhpcy5tYXAuZmx5VG9Cb3VuZHMoYiwgeyBtYXhab29tOiBfbWF4Wm9vbSwgYW5pbWF0ZTogZmFsc2UgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1hcCBib3VuZHMgdG8gZ2VvIHJldWx0cyBpdGVtc1xuICAgKi9cbiAgZmx5VG9HZW9SZXN1bHRzSXRlbXMoKSB7XG4gICAgY29uc3QgYiA9IHRoaXMuZ2VvUmVzdWx0c0xheWVyLmdldEJvdW5kcygpO1xuICAgIHRoaXMubWFwLmZseVRvQm91bmRzKGIsIHsgbWF4Wm9vbTogMTQsIGFuaW1hdGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXAgYm91bmRzIHRvIGdlb2xvY2F0ZWQgcGhvdG9zIGl0ZW1zXG4gICAqL1xuICBmbHlUb0dlb2xvY2F0ZWRQaG90b0l0ZW1zKCkge1xuICAgIGNvbnN0IGIgPSB0aGlzLmdlb2xvY2F0ZWRQaG90b0xhdExuZ0xheWVyLmdldEJvdW5kcygpO1xuICAgIHRoaXMubWFwLmZseVRvQm91bmRzKGIsIHsgbWF4Wm9vbTogMTQsIGFuaW1hdGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgYSBtYXJrZXIgb24gZHJhd0l0ZW1zIGZlYXR1cmVHcm91cCB3aXRoIERNUyBpbnB1dCB2YWx1ZXNcbiAgICovXG4gIGFkZE1hcmtlckZyb21EbXNDb29yZCgpIHtcbiAgICAvLyBjbGVhciBkcmF3biBpdGVtcyBsYXllclxuICAgIHRoaXMuY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTtcblxuICAgIC8vIHVwZGF0ZSBtYXAgdG9vbGJhclxuICAgIHRoaXMuc2V0TWFwRWRpdE1vZGUoKTtcbiAgICAvLyBAVE9ETyBjaGVjayBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIHZhbHVlcyAoZm9ybWF0ICsgbGltaXRzKVxuICAgIGNvbnN0IGdlb3BvaW50ID0gbmV3IEdlb1BvaW50KHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xuZ0lucHV0LnZhbHVlLCB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC52YWx1ZSk7XG4gICAgbGVhZmxldE9iamVjdHMuZHJhZ2dhYmxlTWFya2VyKGdlb3BvaW50LmdldExhdERlYygpLCBnZW9wb2ludC5nZXRMb25EZWMoKSwgKGUpID0+IHsgLyogZHJhZ2VuZCBjYWxsYmFjayBmbiAqLyB9KS5hZGRUbyh0aGlzLmRyYXduSXRlbXMpO1xuXG4gICAgLy8gU2V0IChkZWNpbWFsKSBsYXRMbmcgaW5wdXRzXG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuc2V0VmFsdWUoZ2VvcG9pbnQuZ2V0TGF0RGVjKCksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sbmdJbnB1dC5zZXRWYWx1ZShnZW9wb2ludC5nZXRMYXREZWMoKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgLy8gRmx5XG4gICAgdGhpcy5mbHlUb0RyYXduSXRlbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IGEgbWFya2VyIG9uIGRyYXdJdGVtcyBmZWF0dXJlR3JvdXAgd2l0aCBkZWNpbWFsIGlucHV0IHZhbHVlc1xuICAgKi9cbiAgYWRkTWFya2VyRnJvbUxhdExuZ0Nvb3JkKCkge1xuICAgIC8vIGNsZWFyIGRyYXduIGl0ZW1zIGxheWVyXG4gICAgdGhpcy5jbGVhckRyYXduSXRlbXNMYXllcigpO1xuXG4gICAgLy8gdXBkYXRlIG1hcCB0b29sYmFyXG4gICAgdGhpcy5zZXRNYXBFZGl0TW9kZSgpO1xuXG4gICAgLy8gVE9ETyBjaGVjayBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIHZhbHVlcyAoZm9ybWF0ICsgbGltaXRzKVxuICAgIGNvbnN0IGdlb3BvaW50ID0gbmV3IEdlb1BvaW50KE51bWJlcih0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sbmdJbnB1dC52YWx1ZSksIE51bWJlcih0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC52YWx1ZSkpO1xuICAgIGxlYWZsZXRPYmplY3RzLmRyYWdnYWJsZU1hcmtlcihnZW9wb2ludC5nZXRMYXREZWMoKSwgZ2VvcG9pbnQuZ2V0TG9uRGVjKCksIChkcmFnRW5kKSA9PiB7IC8qIGRyYWdlbmQgY2FsbGJhY2sgZm4gKi8gfSkuYWRkVG8odGhpcy5kcmF3bkl0ZW1zKTtcblxuICAgIC8vIFNldCBkbXNMYXRMbmcgaW5wdXRzXG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuc2V0VmFsdWUoZ2VvcG9pbnQuZ2V0TGF0RGVnKCksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC5zZXRWYWx1ZShnZW9wb2ludC5nZXRMb25EZWcoKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgLy8gRmx5XG4gICAgdGhpcy5mbHlUb0RyYXduSXRlbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAqXG4gICovXG4gIGFkZFBvbHlsaW5lKGNvb3JkaW5hdGVzOiBMYXRMbmdFeHByZXNzaW9uW10pIHtcbiAgICAvLyBjbGVhciBkcmF3biBpdGVtcyBsYXllclxuICAgIHRoaXMuY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTtcblxuICAgIC8vIHVwZGF0ZSBtYXAgdG9vbGJhclxuICAgIHRoaXMuc2V0TWFwRWRpdE1vZGUoKTtcblxuICAgIC8vIGRyYXdcbiAgICBjb25zdCBwb2x5bGluZSA9IEwucG9seWxpbmUoY29vcmRpbmF0ZXMpO1xuICAgIHBvbHlsaW5lLmFkZFRvKHRoaXMuZHJhd25JdGVtcyk7XG5cbiAgICAvLyBmbHkgd2l0aCBtYXggem9vbVxuICAgIHRoaXMuZmx5VG9EcmF3bkl0ZW1zKDE4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgaW5wdXQgdmFsdWVzIGFuZCBjYWxsIGdlb2NvZGluZyBhbmQgZWxldmF0aW9uIEFQSVxuICAgKiBTb21ldGltZXMgeW91IG1heSB3YW50IHRvIGZvcmNlIHRoZSBlbGV2YXRpb24gdmFsdWUgYW5kIGF2b2lkIGNhbGxpbmcgZWxldmF0aW9uIEFQSSAoZWcuIGVsZXZhdGlvbiBjb21lIGZyb20gZ3BzIHBob3RvIG1ldGFkYXRhKVxuICAgKiB0aGVuLCB5b3UgY2FzIHVzZSB0aGUgYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpIG9wdGlvblxuICAgKlxuICAgKiBXaGF0IGlzIGRvbmUgaW5zaWRlIHRoaXMgZnVuY3Rpb24gOlxuICAgKiAtIGNyZWF0ZSBhbiBvYnNlcnZhYmxlIHRoYXQgemlwIGFsbCByZXF1aXJlZCBvYnNlcnZhYmxlc1xuICAgKiAtIGRvIGEgc3dpdGNobWFwIG9uIHRoZSBtYWluIG9ic2VydmFibGUgc28gdGhhdCBpZiBvbmUgb25lIHRoZSBzdWItb2JzZXJ2YWJsZSBjaGFuZ2UsIG9sZCBkYXRhIGFyZSBpZ25vcmVkXG4gICAqIC0gd2hlbiB0aGUgbWFpbiBvYnNlcnZhYmxlIGlzIGZpbmlzaGVkLCBjYW4gc2VuZCBuZXcgbG9jYXRpb24gT3V0cHV0XG4gICAqXG4gICAqIFNldmVyYWwgaWYgLyBlbHNlIGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSBhcmUgdXNlZCBiZWNhdXNlIHdoZW5cbiAgICogYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpID09PSBmYWxzZSwgaHR0cFRhc2tzIHJldHVybnMgYSBzaW5nbGUgdmFsdWUgKG9zbVBsYWNlKVxuICAgKiB3aGVyZWFzIGlmIGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSA9PT0gdHJ1ZSwgaHR0cFRhc2tzIHJldHVybnMgYW4gYXJyYXkgb2YgMiB2YWx1ZXMgW2VsZXZhdGlvbiwgb3NtUGxhY2VdXG4gICAqL1xuICBjYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSA9IGZhbHNlLCBhdm9pZENhbGxpbmdHZW9sb2NBcGkgPSBmYWxzZSk6IHZvaWQge1xuXG4gICAgdGhpcy5zZXRMYXRMbmdJbnB1dEZyb21EcmF3bkl0ZW1zKCk7XG4gICAgdGhpcy5zZXRMYXRMbmdEbXNJbnB1dEZyb21EcmF3bkl0ZW1zKCk7XG4gICAgbGV0IGh0dHBUYXNrczogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGxldCBlbGV2YXRpb246IGFueTtcbiAgICBsZXQgb3NtUGxhY2U6IGFueTtcblxuICAgIGlmIChhdm9pZENhbGxpbmdFbGV2YXRpb25BcGkgJiYgIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgaHR0cFRhc2tzID0gdGhpcy5yZXZlcnNlR2VvY29kaW5nRnJvbUlucHV0VmFsdWUoKTtcbiAgICB9IGVsc2UgaWYgKGF2b2lkQ2FsbGluZ0dlb2xvY0FwaSAmJiAhYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpKSB7XG4gICAgICBodHRwVGFza3MgPSB0aGlzLmdldEVsZXZhdGlvbkZyb21JbnB1dFZhbHVlKCk7XG4gICAgfSBlbHNlIGlmICghYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpICYmICFhdm9pZENhbGxpbmdHZW9sb2NBcGkpIHtcbiAgICAgIGh0dHBUYXNrcyA9IHppcChcbiAgICAgICAgdGhpcy5nZXRFbGV2YXRpb25Gcm9tSW5wdXRWYWx1ZSgpLFxuICAgICAgICB0aGlzLnJldmVyc2VHZW9jb2RpbmdGcm9tSW5wdXRWYWx1ZSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpICYmIGF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgLy8gbm90aGluZyB0byBkbyA7IHRocm93IG9yIGxvZyBhbiBlcnJvciA/XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3Bpbm5uZXJzIG9uXG4gICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaTtcbiAgICB0aGlzLmlzTG9hZGluZ0VsZXZhdGlvbiA9ICFhdm9pZENhbGxpbmdFbGV2YXRpb25BcGk7XG5cbiAgICBodHRwVGFza3Muc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZ0VsZXZhdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gZmFsc2U7XG4gICAgICBpZiAoYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpICYmICFhdm9pZENhbGxpbmdHZW9sb2NBcGkpIHtcbiAgICAgICAgZWxldmF0aW9uID0gbnVsbDtcbiAgICAgICAgb3NtUGxhY2UgPSByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKGF2b2lkQ2FsbGluZ0dlb2xvY0FwaSAmJiAhYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpKSB7XG4gICAgICAgIGVsZXZhdGlvbiA9IHJlc3VsdDtcbiAgICAgICAgb3NtUGxhY2UgPSBudWxsO1xuICAgICAgICBlbGV2YXRpb24gPSByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKCFhdm9pZENhbGxpbmdHZW9sb2NBcGkgJiYgIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgICBlbGV2YXRpb24gPSByZXN1bHRbMF07XG4gICAgICAgIG9zbVBsYWNlID0gcmVzdWx0WzFdO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgZWxldmF0aW9uIGlucHV0XG4gICAgICBpZiAoIWF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSkgeyB0aGlzLmVsZXZhdGlvbkZvcm1Hcm91cC5jb250cm9scy5lbGV2YXRpb25JbnB1dC5zZXRWYWx1ZShlbGV2YXRpb24pOyB9XG5cbiAgICAgIC8vIFBhdGNoIHBsYWNlIGlucHV0IHZhbHVlXG4gICAgICBpZiAoIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgICB0aGlzLmdlb1NlYXJjaEZvcm1Hcm91cC5jb250cm9scy5wbGFjZUlucHV0LnBhdGNoVmFsdWUodGhpcy5nZW9jb2RlU2VydmljZS5nZXRSZWFkYmxlQWRkcmVzcyhvc21QbGFjZSksIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGJpbmQgX2xvY2F0aW9uICYgZW1pdCBsb2NhdGlvblxuICAgICAgaWYgKGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSkge1xuICAgICAgICB0aGlzLmJpbmRMb2NhdGlvbk91dHB1dChbdGhpcy5lbGV2YXRpb25Gb3JtR3JvdXAuY29udHJvbHMuZWxldmF0aW9uSW5wdXQudmFsdWUsIG9zbVBsYWNlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRMb2NhdGlvbk91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgLy8gTWFuYWdlIGVycm9yXG4gICAgICAvLyBzcGlubm5lcnMgb2ZmXG4gICAgICB0aGlzLmlzTG9hZGluZ0FkZHJlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nRWxldmF0aW9uID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdWxkIGJlIGltcHJvdmVkIGZvciBjb21wbGV4IHBvbHlnb25zIC8gcG9seWxpbmVzID9cbiAgICogQ291bGQgdXNlIHR1cmYuanNcbiAgICovXG4gIHNldExhdExuZ0lucHV0RnJvbURyYXduSXRlbXMoKTogdm9pZCB7XG4gICAgY29uc3QgY2VudHJvaWQgPSB0aGlzLmRyYXduSXRlbXMuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7XG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuc2V0VmFsdWUoY2VudHJvaWQubGF0KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sbmdJbnB1dC5zZXRWYWx1ZShjZW50cm9pZC5sbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZXRMYXRMbmdEbXNJbnB1dEZyb21EcmF3bkl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IGNlbnRyb2lkID0gdGhpcy5kcmF3bkl0ZW1zLmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgIGNvbnN0IGdlb3BvaW50ID0gbmV3IEdlb1BvaW50KGNlbnRyb2lkLmxuZywgY2VudHJvaWQubGF0KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5wYXRjaFZhbHVlKGdlb3BvaW50LmdldExhdERlZygpKTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC5wYXRjaFZhbHVlKGdlb3BvaW50LmdldExvbkRlZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgZ2V0RWxldmF0aW9uRnJvbUlucHV0VmFsdWUoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5lbGV2YXRpb25TZXJ2aWNlLmdldEVsZXZhdGlvbih0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC52YWx1ZSwgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubG5nSW5wdXQudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVyc2UgZ2VvY29kaW5nIGZyb20gbGF0IC8gbG5nIGlucHV0cyB2YWx1ZXNcbiAgICovXG4gIHJldmVyc2VHZW9jb2RpbmdGcm9tSW5wdXRWYWx1ZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlb2NvZGVTZXJ2aWNlLnJldmVyc2UodGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQudmFsdWUsIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXRpdHVkZSAvIGxvbmdpdHVkZSBETVMgZm9ybSBWYWxpZGF0b3JcbiAgICovXG4gIGxhdExuZ0Rtc1ZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oXFxcXC0pP1swLTldezEsMn1cXFxcw4LCsCBbMC05XXsxLDJ9XFxcXFxcJyBbMC05XXsxLDJ9XFxcXC5bMC05XXsxLDEyfVxcXFxcIicpO1xuICAgIHJldHVybiByZWdleHAudGVzdChjb250cm9sLnZhbHVlKSA/IG51bGwgOiB7IG1hbGZvcm1lZExhdExuZ0Rtc0Zvcm1hdDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExhdGl0dWRlIC8gbG9uZ2l0dWRlIGRlY2ltYWwgZm9ybSB2YWxpZGF0b3JcbiAgICovXG4gIGxhdExuZ0RlY1ZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oXFxcXC0pP1swLTldezEsMn1cXFxcLlswLTldezEsMjB9Jyk7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KGNvbnRyb2wudmFsdWUpID8gbnVsbCA6IHsgbWFsZm9ybWVkTGF0TG5nRGVjRm9ybWF0OiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB1c2VyIHNlbGVjdCBhbiBhZGRyZXNzIHdpdGhpbiB0aGUgYXV0b2NvbXBsZXRlIHJlc3VsdHMgbGlzdFxuICAgKlxuICAgKiBDYWxsIHRoZSBnZW9sb2MgQVBJIDIgdGltZXMgOlxuICAgKiAgLSBmaXJzdCBjYWxsIGlzIGZvciByZXZlcnNlIGdlb2NvZGluZ1xuICAgKiAgLSBzZWNvbmQgY2FsbCBpcyBmb3IgZ2VvY29uZGluZywgc28gdGhlIGFkZHJlc3MgaW5wdXQgKHBsYWNlSW5wdXQpIGlzIHVwZGF0ZWRcbiAgICovXG4gIGFkZHJlc3NTZWxlY3RlZENoYW5nZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpIHtcbiAgICBjb25zdCBvc21QbGFjZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICAvLyBGaXQgbWFwIGJvdW5kc1xuICAgIGNvbnN0IHNvdXRoV2VzdCA9IG5ldyBMLkxhdExuZyhvc21QbGFjZS5ib3VuZGluZ2JveFswXSwgb3NtUGxhY2UuYm91bmRpbmdib3hbMl0pO1xuICAgIGNvbnN0IG5vcnRoRWFzdCA9IG5ldyBMLkxhdExuZyhvc21QbGFjZS5ib3VuZGluZ2JveFsxXSwgb3NtUGxhY2UuYm91bmRpbmdib3hbM10pO1xuICAgIHRoaXMubWFwLmZpdEJvdW5kcyhMLmxhdExuZ0JvdW5kcyhzb3V0aFdlc3QsIG5vcnRoRWFzdCkpO1xuXG4gICAgLy8gQWRkIGdlb2pzb24gdG8gdGhlIG1hcCAoaWYgdXNlciBlbnRlciBhIGNpdHksIGRyYXcgdGhlIGFkbWluaXN0cmF0aXZlIHNoYXBlIG9uIHRoZSBtYXApXG4gICAgdGhpcy5jbGVhckdlb1Jlc3VsdHNMYXllcigpO1xuICAgIHRoaXMuZ2VvUmVzdWx0c0xheWVyLmFkZERhdGEob3NtUGxhY2UuZ2VvanNvbik7XG5cbiAgICAvLyBGbHlcbiAgICB0aGlzLmZseVRvR2VvUmVzdWx0c0l0ZW1zKCk7XG5cbiAgICAvLyBQYXRjaCBpbnB1dCB2YWx1ZVxuICAgIHRoaXMuZ2VvU2VhcmNoRm9ybUdyb3VwLmNvbnRyb2xzLnBsYWNlSW5wdXQucGF0Y2hWYWx1ZSh0aGlzLmdlb2NvZGVTZXJ2aWNlLmdldFJlYWRibGVBZGRyZXNzKG9zbVBsYWNlKSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAvLyBGaWxsIGxhdGl0dWRlLCBsb25naXR1ZGUgJiBhbHRpdHVkZSBpbnB1dHNcbiAgICBjb25zdCBnID0gbmV3IEdlb1BvaW50KE51bWJlcihvc21QbGFjZS5sb24pLCBOdW1iZXIob3NtUGxhY2UubGF0KSk7XG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuc2V0VmFsdWUob3NtUGxhY2UubGF0LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnNldFZhbHVlKG9zbVBsYWNlLmxvbiwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5zZXRWYWx1ZShnLmdldExhdERlZygpICwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC5zZXRWYWx1ZShnLmdldExvbkRlZygpLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuZWxldmF0aW9uRm9ybUdyb3VwLmNvbnRyb2xzLmVsZXZhdGlvbklucHV0LnNldFZhbHVlKG9zbVBsYWNlLmVsZXZhdGlvbiwge2VtaXRFdmVudDogZmFsc2V9KTtcblxuICAgIC8vIERyYXcgYSBwb2x5bGluZSBvciBwbGFjZSBhIG1hcmtlciBhdCB0aGUgY2VudGVyIG9mIGEgcG9seWdvblxuICAgIGlmIChvc21QbGFjZS5nZW9qc29uLnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgLy8gb3NtIGdlb2pzb24gY29vcmRpbmF0ZXMgaXMgbGlrZSBbW2xvbmcsIGxhdF0sIFtsb25nLCBsYXRdLCAuLi5dXG4gICAgICAvLyBidXQgbGVhZmxldCBuZWVkcyBbW2xhdCwgbG9uZ10sIFtsYXQsIGxvbmddLCAuLi5dIGZvcm1hdCAhXG4gICAgICB0aGlzLmdlb2NvZGVTZXJ2aWNlLnNpbXBsaWZ5UG9seWxpbmUob3NtUGxhY2UuZ2VvanNvbi5jb29yZGluYXRlcyk7XG4gICAgICB0aGlzLmFkZFBvbHlsaW5lKHRoaXMuZ2VvY29kZVNlcnZpY2UucmV2ZXJzZUNvcnJkaW5hdGVzQXJyYXkoXG4gICAgICAgIHRoaXMuZ2VvY29kZVNlcnZpY2Uuc2ltcGxpZnlQb2x5bGluZShvc21QbGFjZS5nZW9qc29uLmNvb3JkaW5hdGVzKSkgYXMgTGF0TG5nRXhwcmVzc2lvbltdXG4gICAgICApO1xuICAgICAgdGhpcy5jbGVhckdlb1Jlc3VsdHNMYXllcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZE1hcmtlckZyb21MYXRMbmdDb29yZCgpO1xuICAgIH1cblxuICAgIC8vIENhbGwgZ2VvbG9jIGFuZCBlbGV2YXRpb24gQVBJc1xuICAgIHRoaXMuY2FsbEdlb2xvY0VsZXZhdGlvbkFwaXNVc2luZ0xhdExuZ0lucHV0c1ZhbHVlcyhmYWxzZSwgZmFsc2UpO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGZvcm0gd2hlbiBuZWRkZWQgOiAnZHJhdzpkZWxldGVkJywgZXRjLlxuICAgKi9cbiAgY2xlYXJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxhdElucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xhdElucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xuZ0lucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLnJlc2V0KCk7XG5cbiAgICB0aGlzLmVsZXZhdGlvbkZvcm1Hcm91cC5jb250cm9scy5lbGV2YXRpb25JbnB1dC5zZXRWYWx1ZSgnJywge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLmVsZXZhdGlvbkZvcm1Hcm91cC5yZXNldCgpO1xuXG4gICAgdGhpcy5nZW9TZWFyY2hGb3JtR3JvdXAuY29udHJvbHMucGxhY2VJbnB1dC5zZXRWYWx1ZSgnJywge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBnZW9SZXN1bHRzIGxheWVyIChlZyB0aGlzIGxheWVyIGNvbnRhaW5zIGFkbWluaXN0cmF0aXZlIHBvbHlnb25zIC0tIFwiY29tbXVuZVwiKVxuICAgKi9cbiAgY2xlYXJHZW9SZXN1bHRzTGF5ZXIoKSB7XG4gICAgdGhpcy5nZW9SZXN1bHRzTGF5ZXIuY2xlYXJMYXllcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3bkl0ZW1zLmNsZWFyTGF5ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHJlc2V0TG9jYXRpb24oKSB7XG4gICAgdGhpcy5sb2NhdGlvbiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBkYXRhIGZyb20gZWxldmF0aW9uIGFuZCBPU00gaHR0cCByZXN1bHRzIHRvIHRoaXMuX2xvY2F0aW9uXG4gICAqIFBlcmZvcm0gc29tZSB2ZXJpZmljYXRpb25zIHRvIGVuc3VyZSBkYXRhIGludGVncml0eVxuICAgKiBAcGFyYW0gZGF0YSBkYXRhWzBdID0gZWxldmF0aW9uLCBkYXRhWzFdID0gb3NtIGRhdGEgfCBkYXRhID0gb3NtIGRhdGFcbiAgICovXG4gIGJpbmRMb2NhdGlvbk91dHB1dChkYXRhOiBBcnJheTxhbnk+IHwgYW55KTogdm9pZCB7XG4gICAgLy8gaWYgZWxldmF0aW9uID0gMCBvciBudWxsID9cbiAgICAvLyBpZiBvc20gZGF0YSBpbmNvbXBsZXRlID9cbiAgICBsZXQgZWxldmF0aW9uOiBhbnk7XG4gICAgbGV0IG9zbVBsYWNlOiBhbnk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGVsZXZhdGlvbiA9IGRhdGFbMF07XG4gICAgICBvc21QbGFjZSA9IGRhdGFbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXZhdGlvbiA9IHRoaXMuZWxldmF0aW9uRm9ybUdyb3VwLmNvbnRyb2xzLmVsZXZhdGlvbklucHV0LnZhbHVlO1xuICAgICAgb3NtUGxhY2UgPSBkYXRhO1xuICAgIH1cbiAgICB0aGlzLl9sb2NhdGlvbi5nZW9tZXRyeSA9IHRoaXMuZHJhd25JdGVtcy50b0dlb0pTT04oKTtcbiAgICAvLyBnZW9kYXR1bVxuICAgIHRoaXMuX2xvY2F0aW9uLmVsZXZhdGlvbiA9IGVsZXZhdGlvbjtcbiAgICB0aGlzLl9sb2NhdGlvbi5sb2NhbGl0eUNvbnNpc3RlbmN5ID0gdGhpcy5fbG9jYXRpb24ubG9jYWxpdHlDb25zaXN0ZW5jeSA/IHRydWUgOiBudWxsOyAgIC8vIHBlcmZvcm0gOiBDb2jDg8KpcmVuY2UgZW50cmUgbGVzIGNvb3Jkb25uw4PCqWVzIGV0IGxhIGxvY2FsaXTDg8KpXG4gICAgdGhpcy5fbG9jYXRpb24ubG9jYXRpb25BY2N1cmFjeSA9IHRoaXMuX2xvY2F0aW9uLmxvY2F0aW9uQWNjdXJhY3kgPyAwIDogbnVsbDsgICAgICAgICAvLyBwZXJmb3JtIDogUHLDg8KpY2lzaW9uIChvdSBpbmNlcnRpdHVkZSkgZGUgbGEgbG9jYWxpc2F0aW9uLCBlbiBtw4PCqHRyZXMgLS0+IHZvaXIgbGUgbm9tYnJlIGRlIGTDg8KpY2ltYWxlcyBwb3VyIGRlY0xhdElucHV0IG91IGRlY0xuZ0lucHV0IHNpIHBvaW50LCBzaW5vbiwgZGVtaS1sb25nZXVyIGRlIGxhIGJvdW5kaW5nLWJveFxuICAgIC8vIHB1Ymxpc2hlZF9sb2NhdGlvbiA6IFByw4PCqWNpc2lvbiBnw4PCqW9ncmFwaGlxdWUgw4PCoCBsYXF1ZWxsZSBlc3QgcHVibGnDg8KpZSBsJ29icywgcGVybWV0IGRlIGfDg8KpcmVyIGxlIGZsb3V0YWdlIC0gUHLDg8KpY2lzZSwgTG9jYWxpdMODwqksIE1haWxsZSAxMHgxMGttXG5cbiAgICB0aGlzLl9sb2NhdGlvbi5vc21Db3VudHJ5ID0gb3NtUGxhY2UuYWRkcmVzcy5jb3VudHJ5O1xuICAgIHRoaXMuX2xvY2F0aW9uLm9zbUNvdW50cnlDb2RlID0gb3NtUGxhY2UuYWRkcmVzcy5jb3VudHJ5X2NvZGU7XG4gICAgdGhpcy5fbG9jYXRpb24ub3NtQ291bnR5ID0gb3NtUGxhY2UuYWRkcmVzcy5jb3VudHk7XG4gICAgdGhpcy5fbG9jYXRpb24ub3NtUG9zdGNvZGUgPSBvc21QbGFjZS5hZGRyZXNzLnBvc3Rjb2RlO1xuICAgIGlmIChvc21QbGFjZS5hZGRyZXNzLmNpdHkpIHsgdGhpcy5fbG9jYXRpb24ubG9jYWxpdHkgPSBvc21QbGFjZS5hZGRyZXNzLmNpdHk7IH1cbiAgICBpZiAob3NtUGxhY2UuYWRkcmVzcy50b3duKSB7IHRoaXMuX2xvY2F0aW9uLmxvY2FsaXR5ID0gb3NtUGxhY2UuYWRkcmVzcy50b3duOyB9XG4gICAgaWYgKG9zbVBsYWNlLmFkZHJlc3MudmlsbGFnZSkgeyB0aGlzLl9sb2NhdGlvbi5sb2NhbGl0eSA9IG9zbVBsYWNlLmFkZHJlc3MudmlsbGFnZTsgfVxuXG4gICAgdGhpcy5fbG9jYXRpb24uc3VibG9jYWxpdHkgPSBvc21QbGFjZS5oYW1sZXQ7XG5cbiAgICB0aGlzLl9sb2NhdGlvbi5vc21Sb2FkID0gb3NtUGxhY2UuYWRkcmVzcy5yb2FkO1xuICAgIHRoaXMuX2xvY2F0aW9uLm9zbVN0YXRlID0gb3NtUGxhY2UuYWRkcmVzcy5zdGF0ZTtcbiAgICB0aGlzLl9sb2NhdGlvbi5vc21TdWJ1cmIgPSBvc21QbGFjZS5hZGRyZXNzLnN1YnVyYjtcblxuICAgIHRoaXMuX2xvY2F0aW9uLm9zbUlkID0gb3NtUGxhY2Uub3NtX2lkO1xuICAgIHRoaXMuX2xvY2F0aW9uLm9zbU5laWdoYm91cmhvb2QgPSBudWxsOyAgICAgIC8vIG5vdCBwcm92aWRlZCBieSBub21pbmF0aW1cbiAgICB0aGlzLl9sb2NhdGlvbi5vc21QbGFjZUlkID0gb3NtUGxhY2UucGxhY2VfaWQ7XG4gICAgdGhpcy5fbG9jYXRpb24ucHVibGlzaGVkTG9jYXRpb24gPSBudWxsOyAgICAgLy8gcGVyZm9ybVxuICAgIHRoaXMuX2xvY2F0aW9uLnN0YXRpb24gPSBudWxsOyAgICAgICAgICAgICAgIC8vIHBlcmZvcm1cblxuICAgIC8vIFZlcmlmaWNhdGlvbnNcbiAgICAvLyBAdG9kb1xuXG4gICAgLy8gRW1pdFxuICAgIHRoaXMubG9jYXRpb24ubmV4dCh0aGlzLl9sb2NhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBmb3JtIGNvb3JkaW5hdGVzIGZvcm1hdCA6ICdkZWNpbWFsJyBvciAnZG1zJ1xuICAgKi9cbiAgc2V0TGF0TG5nSW5wdXRGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoZm9ybWF0ICE9PSAnZGVjaW1hbCcgJiYgZm9ybWF0ICE9PSAnZG1zJykgeyByZXR1cm47IH1cbiAgICB0aGlzLmNvb3JkRm9ybWF0ID0gZm9ybWF0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnB1dHMgdmFsdWVzLCBhZGQgYSBtYXJrZXIgYW5kIGNhbGwgQVBJIGZvciBhIGdlb2xvY2F0ZWQgcGhvdG9cbiAgICovXG4gIGdwc01hcmtlclNldFZhbHVlcyhsYXREZWMsIGxuZ0RlYywgZWxldmF0aW9uKSB7XG4gICAgLy8gc2V0IGlucHV0cyB2YWx1ZXNcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC5zZXRWYWx1ZShsYXREZWMpO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnNldFZhbHVlKGxuZ0RlYyk7XG4gICAgdGhpcy5lbGV2YXRpb25Gb3JtR3JvdXAuY29udHJvbHMuZWxldmF0aW9uSW5wdXQuc2V0VmFsdWUoZWxldmF0aW9uKTtcblxuICAgIC8vIGFkZCBtYXJrZXJcbiAgICB0aGlzLmFkZE1hcmtlckZyb21MYXRMbmdDb29yZCgpO1xuXG4gICAgLy8gY2FsbCBBUElzXG4gICAgdGhpcy5jYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKHRydWUsIGZhbHNlKTtcblxuICAgIC8vIGNsZWFyIGdlb2xvY2F0ZWQgcGhvdG9zIGxheWVyXG4gICAgdGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdMYXllci5jbGVhckxheWVycygpO1xuICB9XG5cbiAgbGF0TG5nRG1zQXV0b0Zvcm1hdHRlcih2YWx1ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPc21QbGFjZU1vZGVsIH0gZnJvbSAnLi4vX21vZGVscy9vc21QbGFjZS5tb2RlbCc7XG5pbXBvcnQgeyBHZW9jb2RpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlJztcblxuLyoqXG4gKiBUbyBzaG93IGFuIGFkZHJlc3MgdG8gdGhlIHVzZXIsIHdlIGNvdWxkIHVzZSB0aGUgZGlzcGxheV9uYW1lIGF0dHJpYnV0ZSByZXR1cm5lZCBieSBub21pbmF0aW1cbiAqIFRoaXMgYXR0cmlidXRlIGlzIGZhciBjb21wbGljYXRlZCB0byByZWFkIChyb2FkLCBuZWlnaGJvdXJob29kLCBzdWJ1cmIsIHRvd24sIGNpdHksIHBvc3Rjb2RlLCBjb3VudHksIGNvdW50cnksIGV0Yy4pXG4gKiBUaGlzIHBpcGUgdXNlIHRoZSBnZXRSZWFkYmxlQWRkcmVzcygpIGZ1bmN0aW9uIG9mIGdlb2NvZGUgc2VydmljZSB0byBzaG93IG1pbmltYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkgbm9taW5hdGltIEFQSVxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICdvc21QbGFjZVJlYWRhYmxlQWRkcmVzcydcbn0pXG5leHBvcnQgY2xhc3MgT3NtUGxhY2VSZWFkYWJsZUFkZHJlc3NQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnZW9jb2RlU2VydmljZTogR2VvY29kaW5nU2VydmljZSkgeyB9XG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBPc21QbGFjZU1vZGVsLCBhcmdzPzogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW9jb2RlU2VydmljZS5nZXRSZWFkYmxlQWRkcmVzcyh2YWx1ZSk7XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGUsIE1hdENoaXBzTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdFJhZGlvTW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBMZWFmbGV0TW9kdWxlIH0gZnJvbSAnQGFzeW1tZXRyaWsvbmd4LWxlYWZsZXQnO1xuaW1wb3J0IHsgTGVhZmxldERyYXdNb2R1bGUgfSBmcm9tICdAYXN5bW1ldHJpay9uZ3gtbGVhZmxldC1kcmF3JztcblxuaW1wb3J0IHsgVGJHZW9sb2NMaWJDb21wb25lbnQgfSBmcm9tICcuL3RiLWdlb2xvYy1saWIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hcENvbXBvbmVudCB9IGZyb20gJy4vbWFwL21hcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvY29kaW5nU2VydmljZSB9IGZyb20gJy4vX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEVsZXZhdGlvblNlcnZpY2UgfSBmcm9tICcuL19zZXJ2aWNlcy9lbGV2YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPc21QbGFjZVJlYWRhYmxlQWRkcmVzc1BpcGUgfSBmcm9tICcuL19waXBlcy9vc20tcGxhY2UtcmVhZGFibGUtYWRkcmVzcy5waXBlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSxcbiAgICBCcm93c2VyTW9kdWxlLFxuICAgIEh0dHBDbGllbnRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGUsIE1hdENoaXBzTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdFJhZGlvTW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0VGFibGVNb2R1bGUsXG4gICAgTGVhZmxldE1vZHVsZS5mb3JSb290KCksIExlYWZsZXREcmF3TW9kdWxlLmZvclJvb3QoKSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbIFRiR2VvbG9jTGliQ29tcG9uZW50LCBNYXBDb21wb25lbnQsIE9zbVBsYWNlUmVhZGFibGVBZGRyZXNzUGlwZSBdLFxuICBleHBvcnRzOiBbIFRiR2VvbG9jTGliQ29tcG9uZW50LCBNYXBDb21wb25lbnQgXVxufSlcbmV4cG9ydCBjbGFzcyBUYkdlb2xvY0xpYk1vZHVsZSB7XG4gIHByb3ZpZGVyczogW1xuICAgIEdlb2NvZGluZ1NlcnZpY2UsIEVsZXZhdGlvblNlcnZpY2VcbiAgXTtcbn1cbiJdLCJuYW1lcyI6WyJtYXJrZXIiLCJMLm1hcmtlciIsIkwuaWNvbiIsIkwuQ29udHJvbCIsIkwudGlsZUxheWVyIiwiTC5nZW9KU09OIiwiTC5sYXRMbmciLCJMLkZlYXR1cmVHcm91cCIsImxlYWZsZXRPYmplY3RzLmRyYXdDb250cm9sUGFuZWwiLCJsZWFmbGV0T2JqZWN0cy5kcmF3Q29udHJvbEVkaXRQYW5lbCIsImxlYWZsZXRPYmplY3RzLmNpcmNsZU1hcmtlclN0eWxlIiwibGVhZmxldE9iamVjdHMuY2l0eVN0eWxlIiwibGF0TG5nIiwiTC5NYXJrZXIiLCJsZWFmbGV0T2JqZWN0cy5ncHNQaG90b01hcmtlckljb24iLCJtYXAiLCJMLmNvbnRyb2wiLCJsZWFmbGV0T2JqZWN0cy5kcmFnZ2FibGVNYXJrZXIiLCJwb2x5bGluZSIsIkwucG9seWxpbmUiLCJjb250cm9sIiwiTC5MYXRMbmciLCJMLmxhdExuZ0JvdW5kcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0lBU0U7S0FBaUI7Ozs7SUFFakIsdUNBQVE7OztJQUFSO0tBQ0M7O2dCQVZGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxRQUFRLEVBQUUsRUFBRTtvQkFDWixNQUFNLEVBQUUsRUFBRTtpQkFDWDs7OzsrQkFORDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNhQSxJQUFhLFFBQVEsR0FBRyxVQUFTLEdBQUcsRUFBRSxHQUFHO0lBR3ZDLFFBQVEsUUFBTyxHQUFHLENBQUM7UUFFZixLQUFLLFFBQVE7WUFFVCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUVsQixNQUFNO1FBRVYsS0FBSyxR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QUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTs7WUFFbEYsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUFFO1lBQzdDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQUU7U0FDNUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQUU7WUFDbEYsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTtZQUNsRixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtZQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtTQUMxQztRQUNILElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQUU7WUFDbEYsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTtZQUNsRixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtZQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtTQUMxQztRQUNILElB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

/***/ }),

/***/ "./node_modules/@angular/compiler/src sync recursive":
/*!*************************************************!*\
  !*** ./node_modules/@angular/compiler/src sync ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

function webpackEmptyContext(req) {
        var e = new Error('Cannot find module "' + req + '".');
        e.code = 'MODULE_NOT_FOUND';
        throw e;
}
webpackEmptyContext.keys = function() { return []; };
webpackEmptyContext.resolve = webpackEmptyContext;
module.exports = webpackEmptyContext;
webpackEmptyContext.id = "./node_modules/@angular/compiler/src sync recursive";

/***/ }),

/***/ "./src/$$_lazy_route_resource lazy recursive":
/*!**********************************************************!*\
  !*** ./src/$$_lazy_route_resource lazy namespace object ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

function webpackEmptyAsyncContext(req) {
        // Here Promise.resolve().then() is used instead of new Promise() to prevent
        // uncaught exception popping up in devtools
        return Promise.resolve().then(function() {
                var e = new Error('Cannot find module "' + req + '".');
                e.code = 'MODULE_NOT_FOUND';
                throw e;
        });
}
webpackEmptyAsyncContext.keys = function() { return []; };
webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
module.exports = webpackEmptyAsyncContext;
webpackEmptyAsyncContext.id = "./src/$$_lazy_route_resource lazy recursive";

/***/ }),

/***/ "./src/app/app.component.css":
/*!***********************************!*\
  !*** ./src/app/app.component.css ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = ""

/***/ }),

/***/ "./src/app/app.component.html":
/*!************************************!*\
  !*** ./src/app/app.component.html ***!
  \************************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = "<tb-geoloc-map\n  [geolocatedPhotoLatLng]=testLatLngData\n  [osmClassFilter]=osmClassFilter\n  (location)=locationChange($event)>\n</tb-geoloc-map>\n\n\n<div (click)=\"emitLatLngData()\">Simuler l'import de photos géolocalisées</div>"

/***/ }),

/***/ "./src/app/app.component.ts":
/*!**********************************!*\
  !*** ./src/app/app.component.ts ***!
  \**********************************/
/*! exports provided: AppComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppComponent", function() { return AppComponent; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};

var AppComponent = /** @class */ (function () {
    function AppComponent() {
        this.testLatLngData = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
        this.osmClassFilter = ['highway:*'];
    }
    AppComponent.prototype.locationChange = function (data) {
        console.log(data);
    };
    AppComponent.prototype.emitLatLngData = function () {
        var data = [
            {
                lat: { deg: 44, min: 27, sec: 8.976 },
                lng: { deg: 1, min: 9, sec: 24.84 },
                altitude: 187.6,
                photoName: 'PA050156.JPG'
            },
            {
                lat: { deg: 46, min: 27, sec: 5.432 },
                lng: { deg: 3, min: 12, sec: 24.84 },
                altitude: 187.6,
                photoName: 'PA050234.JPG'
            },
            {
                lat: { deg: 48, min: 25, sec: 8.765 },
                lng: { deg: 6, min: 15, sec: 24.84 },
                altitude: 187.6,
                photoName: 'PA050789.JPG'
            }
        ];
        console.log('app emit gps data...');
        this.testLatLngData.next(data);
    };
    AppComponent = __decorate([
        Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({
            selector: 'app-root',
            template: __webpack_require__(/*! ./app.component.html */ "./src/app/app.component.html"),
            styles: [__webpack_require__(/*! ./app.component.css */ "./src/app/app.component.css")]
        })
    ], AppComponent);
    return AppComponent;
}());



/***/ }),

/***/ "./src/app/app.module.ts":
/*!*******************************!*\
  !*** ./src/app/app.module.ts ***!
  \*******************************/
/*! exports provided: AppModule */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppModule", function() { return AppModule; });
/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js");
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _app_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app.component */ "./src/app/app.component.ts");
/* harmony import */ var tb_geoloc_lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tb-geoloc-lib */ "./dist/tb-geoloc-lib/fesm5/tb-geoloc-lib.js");
var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};




var AppModule = /** @class */ (function () {
    function AppModule() {
    }
    AppModule = __decorate([
        Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"])({
            declarations: [
                _app_component__WEBPACK_IMPORTED_MODULE_2__["AppComponent"]
            ],
            imports: [
                _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__["BrowserModule"],
                tb_geoloc_lib__WEBPACK_IMPORTED_MODULE_3__["TbGeolocLibModule"]
            ],
            providers: [],
            bootstrap: [_app_component__WEBPACK_IMPORTED_MODULE_2__["AppComponent"]]
        })
    ], AppModule);
    return AppModule;
}());



/***/ }),

/***/ "./src/environments/environment.ts":
/*!*****************************************!*\
  !*** ./src/environments/environment.ts ***!
  \*****************************************/
/*! exports provided: environment */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "environment", function() { return environment; });
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`.
var environment = {
    production: false
};
/*
 * In development mode, to ignore zone related error stack frames such as
 * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can
 * import the following file, but please comment it out in production mode
 * because it will have performance impact when throw error
 */
// import 'zone.js/dist/zone-error';  // Included with Angular CLI.


/***/ }),

/***/ "./src/main.ts":
/*!*********************!*\
  !*** ./src/main.ts ***!
  \*********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/platform-browser-dynamic */ "./node_modules/@angular/platform-browser-dynamic/fesm5/platform-browser-dynamic.js");
/* harmony import */ var _app_app_module__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app/app.module */ "./src/app/app.module.ts");
/* harmony import */ var _environments_environment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./environments/environment */ "./src/environments/environment.ts");




if (_environments_environment__WEBPACK_IMPORTED_MODULE_3__["environment"].production) {
    Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["enableProdMode"])();
}
Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__["platformBrowserDynamic"])().bootstrapModule(_app_app_module__WEBPACK_IMPORTED_MODULE_2__["AppModule"])
    .catch(function (err) { return console.log(err); });


/***/ }),

/***/ 0:
/*!***************************!*\
  !*** multi ./src/main.ts ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(/*! /home/stephane/dev/tb-geoloc-lib/src/main.ts */"./src/main.ts");


/***/ })

},[[0,"runtime","vendor"]]]);
//# sourceMappingURL=main.js.map