UNPKG

@blare/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

276 lines 28.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { Subject, merge } from 'rxjs'; import { takeUntil, switchMap, map, scan, filter, share, tap } from 'rxjs/operators'; import { utils } from '../utils/utils'; var GridsterPrototypeService = /** @class */ (function () { function GridsterPrototypeService() { this.isDragging = false; this.dragSubject = new Subject(); this.dragStartSubject = new Subject(); this.dragStopSubject = new Subject(); } /** * @param {?} gridster * @return {?} */ GridsterPrototypeService.prototype.observeDropOver = /** * @param {?} gridster * @return {?} */ function (gridster) { var _this = this; return this.dragStopSubject.pipe(filter(function (data) { /** @type {?} */ var gridsterEl = gridster.gridsterComponent.$element; /** @type {?} */ var isOverNestedGridster = [].slice.call(gridsterEl.querySelectorAll('gridster')) .reduce(function (isOverGridster, nestedGridsterEl) { return isOverGridster || _this.isOverGridster(data.item, nestedGridsterEl, data.event, gridster.options); }, false); if (isOverNestedGridster) { return false; } return _this.isOverGridster(data.item, gridsterEl, data.event, gridster.options); }), tap(function (data) { // TODO: what we should provide as a param? // prototype.drop.emit({item: prototype.item}); data.item.onDrop(gridster); })); }; /** * @param {?} gridster * @return {?} */ GridsterPrototypeService.prototype.observeDropOut = /** * @param {?} gridster * @return {?} */ function (gridster) { var _this = this; return this.dragStopSubject.pipe(filter(function (data) { /** @type {?} */ var gridsterEl = gridster.gridsterComponent.$element; return !_this.isOverGridster(data.item, gridsterEl, data.event, gridster.options); }), tap(function (data) { // TODO: what we should provide as a param? data.item.onCancel(); })); }; /** * @param {?} gridster * @return {?} */ GridsterPrototypeService.prototype.observeDragOver = /** * @param {?} gridster * @return {?} */ function (gridster) { var _this = this; /** @type {?} */ var over = this.dragSubject.pipe(map(function (data) { /** @type {?} */ var gridsterEl = gridster.gridsterComponent.$element; return { item: data.item, event: data.event, isOver: _this.isOverGridster(data.item, gridsterEl, data.event, gridster.options), isDrop: false }; })); /** @type {?} */ var drop = this.dragStopSubject.pipe(map(function (data) { /** @type {?} */ var gridsterEl = gridster.gridsterComponent.$element; return { item: data.item, event: data.event, isOver: _this.isOverGridster(data.item, gridsterEl, data.event, gridster.options), isDrop: true }; })); /** @type {?} */ var dragExt = merge( // dragStartSubject is connected in case when item prototype is placed above gridster // and drag enter is not fired this.dragStartSubject.pipe(map(function () { return ({ item: null, isOver: false, isDrop: false }); })), over, drop).pipe(scan(function (prev, next) { return { item: next.item, event: next.event, isOver: next.isOver, isEnter: prev.isOver === false && next.isOver === true, isOut: prev.isOver === true && next.isOver === false && !prev.isDrop, isDrop: next.isDrop }; }), filter(function (data) { return !data.isDrop; }), share()); /** @type {?} */ var dragEnter = this.createDragEnterObservable(dragExt, gridster); /** @type {?} */ var dragOut = this.createDragOutObservable(dragExt, gridster); /** @type {?} */ var dragOver = dragEnter .pipe(switchMap(function () { return _this.dragSubject.pipe(takeUntil(dragOut)); }), map(function (data) { return data.item; })); return { dragEnter: dragEnter, dragOut: dragOut, dragOver: dragOver }; }; /** * @param {?} item * @param {?} event * @return {?} */ GridsterPrototypeService.prototype.dragItemStart = /** * @param {?} item * @param {?} event * @return {?} */ function (item, event) { this.isDragging = true; this.dragStartSubject.next({ item: item, event: event }); }; /** * @param {?} item * @param {?} event * @return {?} */ GridsterPrototypeService.prototype.dragItemStop = /** * @param {?} item * @param {?} event * @return {?} */ function (item, event) { this.isDragging = false; this.dragStopSubject.next({ item: item, event: event }); }; /** * @param {?} item * @param {?} event * @return {?} */ GridsterPrototypeService.prototype.updatePrototypePosition = /** * @param {?} item * @param {?} event * @return {?} */ function (item, event) { this.dragSubject.next({ item: item, event: event }); }; /** * Creates observable that is fired on dragging over gridster container. */ /** * Creates observable that is fired on dragging over gridster container. * @param {?} dragIsOver * @param {?} gridster * @return {?} */ GridsterPrototypeService.prototype.createDragOverObservable = /** * Creates observable that is fired on dragging over gridster container. * @param {?} dragIsOver * @param {?} gridster * @return {?} */ function (dragIsOver, gridster) { return dragIsOver.pipe(filter(function (data) { return data.isOver && !data.isEnter && !data.isOut; }), map(function (data) { return data.item; }), tap(function (item) { return item.onOver(gridster); })); }; /** * Creates observable that is fired on drag enter gridster container. */ /** * Creates observable that is fired on drag enter gridster container. * @param {?} dragIsOver * @param {?} gridster * @return {?} */ GridsterPrototypeService.prototype.createDragEnterObservable = /** * Creates observable that is fired on drag enter gridster container. * @param {?} dragIsOver * @param {?} gridster * @return {?} */ function (dragIsOver, gridster) { return dragIsOver.pipe(filter(function (data) { return data.isEnter; }), map(function (data) { return data.item; }), tap(function (item) { return item.onEnter(gridster); })); }; /** * Creates observable that is fired on drag out gridster container. */ /** * Creates observable that is fired on drag out gridster container. * @param {?} dragIsOver * @param {?} gridster * @return {?} */ GridsterPrototypeService.prototype.createDragOutObservable = /** * Creates observable that is fired on drag out gridster container. * @param {?} dragIsOver * @param {?} gridster * @return {?} */ function (dragIsOver, gridster) { return dragIsOver.pipe(filter(function (data) { return data.isOut; }), map(function (data) { return data.item; }), tap(function (item) { return item.onOut(gridster); })); }; /** * Checks whether "element" position fits inside "containerEl" position. * It checks if "element" is totally covered by "containerEl" area. */ /** * Checks whether "element" position fits inside "containerEl" position. * It checks if "element" is totally covered by "containerEl" area. * @param {?} item * @param {?} gridsterEl * @param {?} event * @param {?} options * @return {?} */ GridsterPrototypeService.prototype.isOverGridster = /** * Checks whether "element" position fits inside "containerEl" position. * It checks if "element" is totally covered by "containerEl" area. * @param {?} item * @param {?} gridsterEl * @param {?} event * @param {?} options * @return {?} */ function (item, gridsterEl, event, options) { /** @type {?} */ var el = item.$element; /** @type {?} */ var parentItem = (/** @type {?} */ (gridsterEl.parentElement)) && (/** @type {?} */ (gridsterEl.parentElement.closest('gridster-item'))); if (parentItem) { return this.isOverGridster(item, parentItem, event, options); } switch (options.tolerance) { case 'fit': return utils.isElementFitContainer(el, gridsterEl); case 'intersect': return utils.isElementIntersectContainer(el, gridsterEl); case 'touch': return utils.isElementTouchContainer(el, gridsterEl); default: return utils.isCursorAboveElement(event, gridsterEl); } }; GridsterPrototypeService.decorators = [ { type: Injectable } ]; /** @nocollapse */ GridsterPrototypeService.ctorParameters = function () { return []; }; return GridsterPrototypeService; }()); export { GridsterPrototypeService }; if (false) { /** @type {?} */ GridsterPrototypeService.prototype.isDragging; /** @type {?} */ GridsterPrototypeService.prototype.dragSubject; /** @type {?} */ GridsterPrototypeService.prototype.dragStartSubject; /** @type {?} */ GridsterPrototypeService.prototype.dragStopSubject; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYmxhcmUvYW5ndWxhcjJncmlkc3Rlci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkc3Rlci1wcm90b3R5cGUvZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXJGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd2QztJQVdJO1FBUlEsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFakMscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUV0QyxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7SUFFOUIsQ0FBQzs7Ozs7SUFFaEIsa0RBQWU7Ozs7SUFBZixVQUFpQixRQUF5QjtRQUExQyxpQkFzQkM7UUFyQkcsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDNUIsTUFBTSxDQUFDLFVBQUMsSUFBSTs7Z0JBQ0YsVUFBVSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFROztnQkFDaEQsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM5RSxNQUFNLENBQUMsVUFBQyxjQUFjLEVBQUUsZ0JBQWdCO2dCQUNyQyxPQUFPLGNBQWM7b0JBQ2pCLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2RixDQUFDLEVBQUUsS0FBSyxDQUFDO1lBRWIsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxPQUFPLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLFVBQUMsSUFBSTtZQUNMLDJDQUEyQztZQUMzQywrQ0FBK0M7WUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7Ozs7O0lBRUQsaURBQWM7Ozs7SUFBZCxVQUFnQixRQUF5QjtRQUF6QyxpQkFZQztRQVhHLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQzVCLE1BQU0sQ0FBQyxVQUFDLElBQUk7O2dCQUNGLFVBQVUsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUTtZQUV0RCxPQUFPLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsVUFBQyxJQUFJO1lBQ0wsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7Ozs7O0lBRUQsa0RBQWU7Ozs7SUFBZixVQUFnQixRQUF5QjtRQUF6QyxpQkErREM7O1lBMURTLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDOUIsR0FBRyxDQUFDLFVBQUMsSUFBSTs7Z0JBQ0MsVUFBVSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRO1lBRXRELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsTUFBTSxFQUFFLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDO2dCQUNoRixNQUFNLEVBQUUsS0FBSzthQUNkLENBQUM7UUFDTixDQUFDLENBQUMsQ0FDTDs7WUFFSyxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ2xDLEdBQUcsQ0FBQyxVQUFDLElBQUk7O2dCQUNDLFVBQVUsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUTtZQUV0RCxPQUFPO2dCQUNILElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLE1BQU0sRUFBRSxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDaEYsTUFBTSxFQUFFLElBQUk7YUFDZixDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQ0w7O1lBRUssT0FBTyxHQUFHLEtBQUs7UUFDYixxRkFBcUY7UUFDckYsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQU0sT0FBQSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUE5QyxDQUE4QyxDQUFDLENBQUMsRUFDckYsSUFBSSxFQUNKLElBQUksQ0FDUCxDQUFDLElBQUksQ0FDRixJQUFJLENBQUMsVUFBQyxJQUFTLEVBQUUsSUFBUztZQUN0QixPQUFPO2dCQUNILElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSTtnQkFDdEQsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQ3BFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTthQUN0QixDQUFDO1FBQ04sQ0FBQyxDQUFDLEVBQ0YsTUFBTSxDQUFDLFVBQUMsSUFBUztZQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUNGLEtBQUssRUFBRSxDQUNWOztZQUVDLFNBQVMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQzs7WUFDN0QsT0FBTyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDOztZQUN6RCxRQUFRLEdBQUcsU0FBUzthQUNyQixJQUFJLENBQ0QsU0FBUyxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBekMsQ0FBeUMsQ0FBQyxFQUMxRCxHQUFHLENBQUMsVUFBQyxJQUFTLElBQUssT0FBQSxJQUFJLENBQUMsSUFBSSxFQUFULENBQVMsQ0FBQyxDQUNoQztRQUVMLE9BQU8sRUFBRSxTQUFTLFdBQUEsRUFBRSxPQUFPLFNBQUEsRUFBRSxRQUFRLFVBQUEsRUFBRSxDQUFDO0lBQzVDLENBQUM7Ozs7OztJQUVELGdEQUFhOzs7OztJQUFiLFVBQWMsSUFBb0MsRUFBRSxLQUFxQjtRQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFBLEVBQUUsS0FBSyxPQUFBLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7Ozs7OztJQUVELCtDQUFZOzs7OztJQUFaLFVBQWEsSUFBb0MsRUFBRSxLQUFxQjtRQUNwRSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBQSxFQUFFLEtBQUssT0FBQSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDOzs7Ozs7SUFFRCwwREFBdUI7Ozs7O0lBQXZCLFVBQXdCLElBQW9DLEVBQUUsS0FBcUI7UUFDL0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHOzs7Ozs7O0lBQ0ssMkRBQXdCOzs7Ozs7SUFBaEMsVUFDSSxVQUErRSxFQUMvRSxRQUF5QjtRQUV6QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQ2xCLE1BQU0sQ0FBQyxVQUFDLElBQVMsSUFBSyxPQUFBLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBM0MsQ0FBMkMsQ0FBQyxFQUNsRSxHQUFHLENBQUMsVUFBQyxJQUFTLElBQXFDLE9BQUEsSUFBSSxDQUFDLElBQUksRUFBVCxDQUFTLENBQUMsRUFDN0QsR0FBRyxDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBckIsQ0FBcUIsQ0FBQyxDQUN2QyxDQUFDO0lBQ04sQ0FBQztJQUNEOztPQUVHOzs7Ozs7O0lBQ0ssNERBQXlCOzs7Ozs7SUFBakMsVUFDSSxVQUErRSxFQUMvRSxRQUF5QjtRQUV6QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQ2xCLE1BQU0sQ0FBQyxVQUFDLElBQVMsSUFBSyxPQUFBLElBQUksQ0FBQyxPQUFPLEVBQVosQ0FBWSxDQUFDLEVBQ25DLEdBQUcsQ0FBQyxVQUFDLElBQVMsSUFBcUMsT0FBQSxJQUFJLENBQUMsSUFBSSxFQUFULENBQVMsQ0FBQyxFQUM3RCxHQUFHLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUF0QixDQUFzQixDQUFDLENBQ3hDLENBQUM7SUFDTixDQUFDO0lBQ0Q7O09BRUc7Ozs7Ozs7SUFDSywwREFBdUI7Ozs7OztJQUEvQixVQUNJLFVBQ2lCLEVBQ2pCLFFBQXlCO1FBRXpCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FDbEIsTUFBTSxDQUFDLFVBQUMsSUFBUyxJQUFLLE9BQUEsSUFBSSxDQUFDLEtBQUssRUFBVixDQUFVLENBQUMsRUFDakMsR0FBRyxDQUFDLFVBQUMsSUFBUyxJQUFxQyxPQUFBLElBQUksQ0FBQyxJQUFJLEVBQVQsQ0FBUyxDQUFDLEVBQzdELEdBQUcsQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQXBCLENBQW9CLENBQUMsQ0FDdEMsQ0FBQztJQUNOLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7Ozs7SUFDSyxpREFBYzs7Ozs7Ozs7O0lBQXRCLFVBQXVCLElBQW9DLEVBQUUsVUFBdUIsRUFBRSxLQUFLLEVBQUUsT0FBTzs7WUFDMUYsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFROztZQUNsQixVQUFVLEdBQUcsbUJBQWEsVUFBVSxDQUFDLGFBQWEsRUFBQTtZQUNwRCxtQkFBYSxVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBQTtRQUVsRSxJQUFJLFVBQVUsRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNoRTtRQUVELFFBQVEsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN2QixLQUFLLEtBQUs7Z0JBQ04sT0FBTyxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssV0FBVztnQkFDWixPQUFPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0QsS0FBSyxPQUFPO2dCQUNSLE9BQU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN6RDtnQkFDSSxPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDOztnQkFsTUosVUFBVTs7OztJQW1NWCwrQkFBQztDQUFBLEFBbk1ELElBbU1DO1NBbE1ZLHdCQUF3Qjs7O0lBRWpDLDhDQUEyQjs7SUFFM0IsK0NBQXlDOztJQUV6QyxvREFBOEM7O0lBRTlDLG1EQUE2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHN3aXRjaE1hcCwgbWFwLCBzY2FuLCBmaWx0ZXIsIHNoYXJlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlIH0gZnJvbSAnLi9ncmlkc3Rlci1pdGVtLXByb3RvdHlwZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQge0RyYWdnYWJsZUV2ZW50fSBmcm9tICcuLi91dGlscy9EcmFnZ2FibGVFdmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGRyYWdTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgcHJpdmF0ZSBkcmFnU3RhcnRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgcHJpdmF0ZSBkcmFnU3RvcFN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBvYnNlcnZlRHJvcE92ZXIgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdmVyTmVzdGVkR3JpZHN0ZXIgPSBbXS5zbGljZS5jYWxsKGdyaWRzdGVyRWwucXVlcnlTZWxlY3RvckFsbCgnZ3JpZHN0ZXInKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoaXNPdmVyR3JpZHN0ZXIsIG5lc3RlZEdyaWRzdGVyRWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc092ZXJHcmlkc3RlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBuZXN0ZWRHcmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzT3Zlck5lc3RlZEdyaWRzdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc092ZXJHcmlkc3RlcihkYXRhLml0ZW0sIGdyaWRzdGVyRWwsIGRhdGEuZXZlbnQsIGdyaWRzdGVyLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IHdlIHNob3VsZCBwcm92aWRlIGFzIGEgcGFyYW0/XG4gICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLmRyb3AuZW1pdCh7aXRlbTogcHJvdG90eXBlLml0ZW19KTtcbiAgICAgICAgICAgICAgICBkYXRhLml0ZW0ub25Ecm9wKGdyaWRzdGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZURyb3BPdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCB3ZSBzaG91bGQgcHJvdmlkZSBhcyBhIHBhcmFtP1xuICAgICAgICAgICAgICAgIGRhdGEuaXRlbS5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlRHJhZ092ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHtcbiAgICAgICAgZHJhZ092ZXI6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPixcbiAgICAgICAgZHJhZ0VudGVyOiBPYnNlcnZhYmxlPEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZT4sXG4gICAgICAgIGRyYWdPdXQ6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPlxuICAgIH0ge1xuICAgICAgICBjb25zdCBvdmVyID0gdGhpcy5kcmFnU3ViamVjdC5waXBlKFxuICAgICAgICAgICAgbWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZHN0ZXJFbCA9IGdyaWRzdGVyLmdyaWRzdGVyQ29tcG9uZW50LiRlbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW06IGRhdGEuaXRlbSxcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBkYXRhLmV2ZW50LFxuICAgICAgICAgICAgICAgICAgaXNPdmVyOiB0aGlzLmlzT3ZlckdyaWRzdGVyKGRhdGEuaXRlbSwgZ3JpZHN0ZXJFbCwgZGF0YS5ldmVudCwgZ3JpZHN0ZXIub3B0aW9ucyksXG4gICAgICAgICAgICAgICAgICBpc0Ryb3A6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJvcCA9IHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBtYXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtOiBkYXRhLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBkYXRhLmV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBpc092ZXI6IHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKSxcbiAgICAgICAgICAgICAgICAgICAgaXNEcm9wOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJhZ0V4dCA9IG1lcmdlKFxuICAgICAgICAgICAgICAgIC8vIGRyYWdTdGFydFN1YmplY3QgaXMgY29ubmVjdGVkIGluIGNhc2Ugd2hlbiBpdGVtIHByb3RvdHlwZSBpcyBwbGFjZWQgYWJvdmUgZ3JpZHN0ZXJcbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJhZyBlbnRlciBpcyBub3QgZmlyZWRcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QucGlwZShtYXAoKCkgPT4gKHsgaXRlbTogbnVsbCwgaXNPdmVyOiBmYWxzZSwgaXNEcm9wOiBmYWxzZSB9KSkpLFxuICAgICAgICAgICAgICAgIG92ZXIsXG4gICAgICAgICAgICAgICAgZHJvcFxuICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICAgIHNjYW4oKHByZXY6IGFueSwgbmV4dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBuZXh0Lml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogbmV4dC5ldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzT3ZlcjogbmV4dC5pc092ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0VudGVyOiBwcmV2LmlzT3ZlciA9PT0gZmFsc2UgJiYgbmV4dC5pc092ZXIgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc091dDogcHJldi5pc092ZXIgPT09IHRydWUgJiYgbmV4dC5pc092ZXIgPT09IGZhbHNlICYmICFwcmV2LmlzRHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJvcDogbmV4dC5pc0Ryb3BcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWRhdGEuaXNEcm9wO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJhZ0VudGVyID0gdGhpcy5jcmVhdGVEcmFnRW50ZXJPYnNlcnZhYmxlKGRyYWdFeHQsIGdyaWRzdGVyKTtcbiAgICAgICAgY29uc3QgZHJhZ091dCA9IHRoaXMuY3JlYXRlRHJhZ091dE9ic2VydmFibGUoZHJhZ0V4dCwgZ3JpZHN0ZXIpO1xuICAgICAgICBjb25zdCBkcmFnT3ZlciA9IGRyYWdFbnRlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZHJhZ1N1YmplY3QucGlwZSh0YWtlVW50aWwoZHJhZ091dCkpKSxcbiAgICAgICAgICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4gZGF0YS5pdGVtKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4geyBkcmFnRW50ZXIsIGRyYWdPdXQsIGRyYWdPdmVyIH07XG4gICAgfVxuXG4gICAgZHJhZ0l0ZW1TdGFydChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIGRyYWdJdGVtU3RvcChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnU3RvcFN1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3RvdHlwZVBvc2l0aW9uKGl0ZW06IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSwgZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZHJhZ1N1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb2JzZXJ2YWJsZSB0aGF0IGlzIGZpcmVkIG9uIGRyYWdnaW5nIG92ZXIgZ3JpZHN0ZXIgY29udGFpbmVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRHJhZ092ZXJPYnNlcnZhYmxlIChcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLCBpc092ZXI6IGJvb2xlYW59PixcbiAgICAgICAgZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZVxuICAgICkge1xuICAgICAgICByZXR1cm4gZHJhZ0lzT3Zlci5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGEuaXNPdmVyICYmICFkYXRhLmlzRW50ZXIgJiYgIWRhdGEuaXNPdXQpLFxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcbiAgICAgICAgICAgIHRhcCgoaXRlbSkgPT4gaXRlbS5vbk92ZXIoZ3JpZHN0ZXIpKVxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9ic2VydmFibGUgdGhhdCBpcyBmaXJlZCBvbiBkcmFnIGVudGVyIGdyaWRzdGVyIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdFbnRlck9ic2VydmFibGUgKFxuICAgICAgICBkcmFnSXNPdmVyOiBPYnNlcnZhYmxlPHtpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGlzT3ZlcjogYm9vbGVhbn0+LFxuICAgICAgICBncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBkcmFnSXNPdmVyLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGE6IGFueSkgPT4gZGF0YS5pc0VudGVyKSxcbiAgICAgICAgICAgIG1hcCgoZGF0YTogYW55KTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlID0+IGRhdGEuaXRlbSksXG4gICAgICAgICAgICB0YXAoKGl0ZW0pID0+IGl0ZW0ub25FbnRlcihncmlkc3RlcikpXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb2JzZXJ2YWJsZSB0aGF0IGlzIGZpcmVkIG9uIGRyYWcgb3V0IGdyaWRzdGVyIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdPdXRPYnNlcnZhYmxlIChcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLFxuICAgICAgICBpc092ZXI6IGJvb2xlYW59PixcbiAgICAgICAgZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZVxuICAgICkge1xuICAgICAgICByZXR1cm4gZHJhZ0lzT3Zlci5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGEuaXNPdXQpLFxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcbiAgICAgICAgICAgIHRhcCgoaXRlbSkgPT4gaXRlbS5vbk91dChncmlkc3RlcikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgXCJlbGVtZW50XCIgcG9zaXRpb24gZml0cyBpbnNpZGUgXCJjb250YWluZXJFbFwiIHBvc2l0aW9uLlxuICAgICAqIEl0IGNoZWNrcyBpZiBcImVsZW1lbnRcIiBpcyB0b3RhbGx5IGNvdmVyZWQgYnkgXCJjb250YWluZXJFbFwiIGFyZWEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc092ZXJHcmlkc3RlcihpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGdyaWRzdGVyRWw6IEhUTUxFbGVtZW50LCBldmVudCwgb3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbCA9IGl0ZW0uJGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSA8SFRNTEVsZW1lbnQ+Z3JpZHN0ZXJFbC5wYXJlbnRFbGVtZW50ICYmXG4gICAgICAgICAgICA8SFRNTEVsZW1lbnQ+Z3JpZHN0ZXJFbC5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcblxuICAgICAgICBpZiAocGFyZW50SXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNPdmVyR3JpZHN0ZXIoaXRlbSwgcGFyZW50SXRlbSwgZXZlbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnRvbGVyYW5jZSkge1xuICAgICAgICAgICAgY2FzZSAnZml0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuaXNFbGVtZW50Rml0Q29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcbiAgICAgICAgICAgIGNhc2UgJ2ludGVyc2VjdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudEludGVyc2VjdENvbnRhaW5lcihlbCwgZ3JpZHN0ZXJFbCk7XG4gICAgICAgICAgICBjYXNlICd0b3VjaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudFRvdWNoQ29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzQ3Vyc29yQWJvdmVFbGVtZW50KGV2ZW50LCBncmlkc3RlckVsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==