@hxui/angular
Version:
* * *
263 lines • 20.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable, NgZone, InjectionToken } from '@angular/core';
import { fromEvent } from 'rxjs';
import { map, distinctUntilChanged } from 'rxjs/operators';
import { BehaviorSubject } from 'rxjs/index';
/**
* @record
*/
export function WindowSize() { }
if (false) {
/** @type {?} */
WindowSize.prototype.width;
/** @type {?} */
WindowSize.prototype.height;
}
/**
* @record
*/
export function Breakpoint() { }
if (false) {
/** @type {?|undefined} */
Breakpoint.prototype.min;
/** @type {?|undefined} */
Breakpoint.prototype.max;
}
/**
* @record
*/
export function BreakpointEvent() { }
if (false) {
/** @type {?} */
BreakpointEvent.prototype.name;
/** @type {?} */
BreakpointEvent.prototype.breakpoint;
/** @type {?} */
BreakpointEvent.prototype.size;
}
/**
* @record
*/
export function BreakpointConfig() { }
/** @type {?} */
export var defaultBreakpoints = {
mobile: { max: 768 },
tablet: { min: 769, max: 1023 },
desktop: { min: 1024, max: 1215 },
widescreen: { min: 1216, max: 1407 },
fullhd: { min: 1408 }
};
/** @type {?} */
var FALLBACK_BREAKPOINT = {
min: 0, max: Number.MAX_SAFE_INTEGER
};
/** @type {?} */
export var BREAKPOINTS_CONFIG = new InjectionToken('breakpoints.config');
/**
* @param {?} ngZone
* @param {?} breakpoints
* @return {?}
*/
export function breakpointsFactory(ngZone, breakpoints) {
return new BreakpointsService(ngZone, breakpoints);
}
/**
* @param {?=} breakpoints
* @return {?}
*/
export function breakpointsProviders(breakpoints) {
if (breakpoints === void 0) { breakpoints = defaultBreakpoints; }
return [
{
provide: BREAKPOINTS_CONFIG,
useValue: breakpoints
},
{
provide: BreakpointsService,
useFactory: breakpointsFactory,
deps: [NgZone, BREAKPOINTS_CONFIG]
}
];
}
var BreakpointsService = /** @class */ (function () {
function BreakpointsService(ngZone, breakpoints) {
this.ngZone = ngZone;
this.lastBreakpoint = null;
this.breakpoints = defaultBreakpoints;
this.setBreakpoints(breakpoints);
this.resize = fromEvent(window, 'resize')
.pipe(map(this.getWindowSize), distinctUntilChanged());
/** @type {?} */
var initialBreakpoint = this.getBreakpoint(window.innerWidth);
this.changesSubject = new BehaviorSubject(this.getBreakpointEvent(initialBreakpoint));
this.changes = this.changesSubject.pipe(distinctUntilChanged(function (x, y) { return x.name === y.name; }));
this.subscribe();
}
// Unsubscribe to the resize event
// Unsubscribe to the resize event
/**
* @return {?}
*/
BreakpointsService.prototype.unsubscribe =
// Unsubscribe to the resize event
/**
* @return {?}
*/
function () {
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = null;
}
};
// Subscribe to the resize event
// Subscribe to the resize event
/**
* @return {?}
*/
BreakpointsService.prototype.subscribe =
// Subscribe to the resize event
/**
* @return {?}
*/
function () {
var _this = this;
if (this.subscription) {
return;
}
// Make sure resize event doesn't trigger change detection by running outside of angular zone
this.ngZone.runOutsideAngular(function () {
_this.subscription = _this.resize.subscribe(function (size) {
/** @type {?} */
var breakpoint = _this.getBreakpoint(size.width);
if (breakpoint === _this.lastBreakpoint) {
return;
}
_this.lastBreakpoint = breakpoint;
// Emitting back in angular zone
_this.ngZone.run(function () {
_this.changesSubject.next(_this.getBreakpointEvent(breakpoint));
});
});
});
};
// Sets the customized breakpoints
// Sets the customized breakpoints
/**
* @param {?=} breakpoints
* @return {?}
*/
BreakpointsService.prototype.setBreakpoints =
// Sets the customized breakpoints
/**
* @param {?=} breakpoints
* @return {?}
*/
function (breakpoints) {
if (breakpoints) {
this.breakpoints = breakpoints;
}
};
// Returns a breakpoint event, with the fallback breakpoint if none were found
// Returns a breakpoint event, with the fallback breakpoint if none were found
/**
* @param {?} name
* @return {?}
*/
BreakpointsService.prototype.getBreakpointEvent =
// Returns a breakpoint event, with the fallback breakpoint if none were found
/**
* @param {?} name
* @return {?}
*/
function (name) {
if (!name) {
return { name: 'default', breakpoint: FALLBACK_BREAKPOINT, size: this.getWindowSize() };
}
else {
return { name: name, breakpoint: this.breakpoints[name], size: this.getWindowSize() };
}
};
// Returns the current window size
// Returns the current window size
/**
* @return {?}
*/
BreakpointsService.prototype.getWindowSize =
// Returns the current window size
/**
* @return {?}
*/
function () {
return { width: window.innerWidth, height: window.innerHeight };
};
// Returns the first breakpoint that match the current size
// Returns the first breakpoint that match the current size
/**
* @param {?} currentSize
* @return {?}
*/
BreakpointsService.prototype.getBreakpoint =
// Returns the first breakpoint that match the current size
/**
* @param {?} currentSize
* @return {?}
*/
function (currentSize) {
var e_1, _a;
/** @type {?} */
var keys = Object.keys(this.breakpoints);
try {
for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
var key = keys_1_1.value;
/** @type {?} */
var value = this.breakpoints[key];
/** @type {?} */
var min = value.min || 0;
/** @type {?} */
var max = value.max || Number.MAX_SAFE_INTEGER;
if (currentSize >= min && currentSize < max) {
return key;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
}
finally { if (e_1) throw e_1.error; }
}
return null;
};
BreakpointsService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
BreakpointsService.ctorParameters = function () { return [
null,
{ type: undefined }
]; };
return BreakpointsService;
}());
export { BreakpointsService };
if (false) {
/** @type {?} */
BreakpointsService.prototype.lastBreakpoint;
/** @type {?} */
BreakpointsService.prototype.breakpoints;
/** @type {?} */
BreakpointsService.prototype.changesSubject;
/** @type {?} */
BreakpointsService.prototype.subscription;
/** @type {?} */
BreakpointsService.prototype.changes;
/** @type {?} */
BreakpointsService.prototype.resize;
/** @type {?} */
BreakpointsService.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWtwb2ludC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9icmVha3BvaW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFVLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxZQUFZLENBQUM7Ozs7QUF1QnJFLGdDQUdDOzs7SUFGQywyQkFBYzs7SUFDZCw0QkFBZTs7Ozs7QUFHakIsZ0NBR0M7OztJQUZDLHlCQUFhOztJQUNiLHlCQUFhOzs7OztBQUdmLHFDQUlDOzs7SUFIQywrQkFBYTs7SUFDYixxQ0FBdUI7O0lBQ3ZCLCtCQUFpQjs7Ozs7QUFHbkIsc0NBRUM7O0FBRUQsTUFBTSxLQUFPLGtCQUFrQixHQUFxQjtJQUNsRCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtJQUMvQixPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7SUFDakMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7Q0FDdEI7O0lBRUssbUJBQW1CLEdBQUc7SUFDMUIsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtDQUNyQzs7QUFFRCxNQUFNLEtBQU8sa0JB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R0FBRyxHQUFHLEVBQUU7b0JBQzNDLE9BQU8sR0FBRyxDQUFDO2lCQUNaO2FBQ0Y7Ozs7Ozs7OztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Z0JBMUdGLFVBQVU7Ozs7Ozs7SUEyR1gseUJBQUM7Q0FBQSxBQTNHRCxJQTJHQztTQTFHWSxrQkFBa0I7OztJQUU3Qiw0Q0FBc0M7O0lBQ3RDLHlDQUEyRDs7SUFDM0QsNENBQXlEOztJQUN6RCwwQ0FBbUM7O0lBRW5DLHFDQUFxQzs7SUFDckMsb0NBQStCOztJQUVsQixvQ0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMvaW5kZXgnO1xyXG5cclxuXHJcbi8vIEBleGFtcGxlXHJcbi8vIGltcG9ydCB7IGJyZWFrcG9pbnRzUHJvdmlkZXIsIEJyZWFrcG9pbnRzU2VydmljZSwgQnJlYWtwb2ludEV2ZW50IH0gZnJvbSAnYW5ndWxhci1icmVha3BvaW50cyc7XHJcbi8vXHJcbi8vIEBDb21wb25lbnQoe1xyXG4vLyAgIC8vIC4uLlxyXG4vLyAgIHByb3ZpZGVyczogW2JyZWFrcG9pbnRzUHJvdmlkZXIoKV1cclxuLy8gICAvLyAuLi5cclxuLy8gfSlcclxuLy8gZXhwb3J0IGNsYXNzIFlvdXJDb21wb25lbnQge1xyXG4vL1xyXG4vLyAgIGNvbnN0cnVjdG9yIChwcml2YXRlIGJyZWFrcG9pbnRzU2VydmljZTogQnJlYWtwb2ludHNTZXJ2aWNlKSB7XHJcbi8vXHJcbi8vICAgICB0aGlzLmJyZWFrcG9pbnRzU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSgoZXZlbnQ6IEJyZWFrcG9pbnRFdmVudCkgPT4ge1xyXG4vL1xyXG4vLyAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbi8vICAgICB9KTtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdpbmRvd1NpemUge1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWtwb2ludCB7XHJcbiAgbWluPzogbnVtYmVyO1xyXG4gIG1heD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCcmVha3BvaW50RXZlbnQge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBicmVha3BvaW50OiBCcmVha3BvaW50O1xyXG4gIHNpemU6IFdpbmRvd1NpemU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWtwb2ludENvbmZpZyB7XHJcbiAgW25hbWU6IHN0cmluZ106IEJyZWFrcG9pbnQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0QnJlYWtwb2ludHM6IEJyZWFrcG9pbnRDb25maWcgPSB7XHJcbiAgbW9iaWxlOiB7IG1heDogNzY4IH0sXHJcbiAgdGFibGV0OiB7IG1pbjogNzY5LCBtYXg6IDEwMjMgfSxcclxuICBkZXNrdG9wOiB7IG1pbjogMTAyNCwgbWF4OiAxMjE1IH0sXHJcbiAgd2lkZXNjcmVlbjogeyBtaW46IDEyMTYsIG1heDogMTQwNyB9LFxyXG4gIGZ1bGxoZDogeyBtaW46IDE0MDggfVxyXG59O1xyXG5cclxuY29uc3QgRkFMTEJBQ0tfQlJFQUtQT0lOVCA9IHtcclxuICBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEJSRUFLUE9JTlRTX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxCcmVha3BvaW50Q29uZmlnPignYnJlYWtwb2ludHMuY29uZmlnJyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnJlYWtwb2ludHNGYWN0b3J5IChuZ1pvbmU6IE5nWm9uZSwgYnJlYWtwb2ludHM6IEJyZWFrcG9pbnRDb25maWcpIHtcclxuICByZXR1cm4gbmV3IEJyZWFrcG9pbnRzU2VydmljZShuZ1pvbmUsIGJyZWFrcG9pbnRzKVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJyZWFrcG9pbnRzUHJvdmlkZXJzIChicmVha3BvaW50czogQnJlYWtwb2ludENvbmZpZyA9IGRlZmF1bHRCcmVha3BvaW50cyk6IFByb3ZpZGVyW10ge1xyXG4gIHJldHVybiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IEJSRUFLUE9JTlRTX0NPTkZJRyxcclxuICAgICAgdXNlVmFsdWU6IGJyZWFrcG9pbnRzXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBCcmVha3BvaW50c1NlcnZpY2UsXHJcbiAgICAgIHVzZUZhY3Rvcnk6IGJyZWFrcG9pbnRzRmFjdG9yeSxcclxuICAgICAgZGVwczogW05nWm9uZSwgQlJFQUtQT0lOVFNfQ09ORklHXVxyXG4gICAgfVxyXG4gIF07XHJcbn1cclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCcmVha3BvaW50c1NlcnZpY2UgIHtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0QnJlYWtwb2ludDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIGJyZWFrcG9pbnRzOiBCcmVha3BvaW50Q29uZmlnID0gZGVmYXVsdEJyZWFrcG9pbnRzO1xyXG4gIHByaXZhdGUgY2hhbmdlc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCcmVha3BvaW50RXZlbnQ+O1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNoYW5nZXM6IE9ic2VydmFibGU8QnJlYWtwb2ludEV2ZW50PjtcclxuICByZXNpemU6IE9ic2VydmFibGU8V2luZG93U2l6ZT47XHJcblxyXG4gIGNvbnN0cnVjdG9yIChwcml2YXRlIG5nWm9uZSwgYnJlYWtwb2ludHM/OiBCcmVha3BvaW50Q29uZmlnKSB7XHJcblxyXG4gICAgdGhpcy5zZXRCcmVha3BvaW50cyhicmVha3BvaW50cyk7XHJcblxyXG4gICAgdGhpcy5yZXNpemUgPSBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHRoaXMuZ2V0V2luZG93U2l6ZSksXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxyXG4gICAgICApO1xyXG5cclxuICAgIGNvbnN0IGluaXRpYWxCcmVha3BvaW50ID0gdGhpcy5nZXRCcmVha3BvaW50KHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuY2hhbmdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJyZWFrcG9pbnRFdmVudD4odGhpcy5nZXRCcmVha3BvaW50RXZlbnQoaW5pdGlhbEJyZWFrcG9pbnQpKTtcclxuICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuY2hhbmdlc1N1YmplY3QucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4geC5uYW1lID09PSB5Lm5hbWUpKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVbnN1YnNjcmliZSB0byB0aGUgcmVzaXplIGV2ZW50XHJcbiAgcHVibGljIHVuc3Vic2NyaWJlICgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU3Vic2NyaWJlIHRvIHRoZSByZXNpemUgZXZlbnRcclxuICBwdWJsaWMgc3Vic2NyaWJlICgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1ha2Ugc3VyZSByZXNpemUgZXZlbnQgZG9lc24ndCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gYnkgcnVubmluZyBvdXRzaWRlIG9mIGFuZ3VsYXIgem9uZVxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnJlc2l6ZS5zdWJzY3JpYmUoKHNpemU6IFdpbmRvd1NpemUpID0+IHtcclxuXHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludDogc3RyaW5nID0gdGhpcy5nZXRCcmVha3BvaW50KHNpemUud2lkdGgpO1xyXG5cclxuICAgICAgICBpZiAoYnJlYWtwb2ludCA9PT0gdGhpcy5sYXN0QnJlYWtwb2ludCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sYXN0QnJlYWtwb2ludCA9IGJyZWFrcG9pbnQ7XHJcblxyXG4gICAgICAgIC8vIEVtaXR0aW5nIGJhY2sgaW4gYW5ndWxhciB6b25lXHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlc1N1YmplY3QubmV4dCh0aGlzLmdldEJyZWFrcG9pbnRFdmVudChicmVha3BvaW50KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8gU2V0cyB0aGUgY3VzdG9taXplZCBicmVha3BvaW50c1xyXG4gIHByaXZhdGUgc2V0QnJlYWtwb2ludHMgKGJyZWFrcG9pbnRzPzogQnJlYWtwb2ludENvbmZpZykge1xyXG5cclxuICAgIGlmIChicmVha3BvaW50cykge1xyXG4gICAgICB0aGlzLmJyZWFrcG9pbnRzID0gYnJlYWtwb2ludHM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gUmV0dXJucyBhIGJyZWFrcG9pbnQgZXZlbnQsIHdpdGggdGhlIGZhbGxiYWNrIGJyZWFrcG9pbnQgaWYgbm9uZSB3ZXJlIGZvdW5kXHJcbiAgcHJpdmF0ZSBnZXRCcmVha3BvaW50RXZlbnQgKG5hbWU6IHN0cmluZyk6IEJyZWFrcG9pbnRFdmVudCB7XHJcblxyXG4gICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6ICdkZWZhdWx0JywgYnJlYWtwb2ludDogRkFMTEJBQ0tfQlJFQUtQT0lOVCwgc2l6ZTogdGhpcy5nZXRXaW5kb3dTaXplKCkgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IG5hbWUsIGJyZWFrcG9pbnQ6IHRoaXMuYnJlYWtwb2ludHNbbmFtZV0sIHNpemU6IHRoaXMuZ2V0V2luZG93U2l6ZSgpIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdpbmRvdyBzaXplXHJcbiAgcHJpdmF0ZSBnZXRXaW5kb3dTaXplICgpOiBXaW5kb3dTaXplIHtcclxuXHJcbiAgICByZXR1cm4geyB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0IH07XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gUmV0dXJucyB0aGUgZmlyc3QgYnJlYWtwb2ludCB0aGF0IG1hdGNoIHRoZSBjdXJyZW50IHNpemVcclxuICBwcml2YXRlIGdldEJyZWFrcG9pbnQgKGN1cnJlbnRTaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmJyZWFrcG9pbnRzKTtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJyZWFrcG9pbnRzW2tleV07XHJcbiAgICAgIGNvbnN0IG1pbiA9IHZhbHVlLm1pbiB8fCAwO1xyXG4gICAgICBjb25zdCBtYXggPSB2YWx1ZS5tYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XHJcblxyXG4gICAgICBpZiAoY3VycmVudFNpemUgPj0gbWluICYmIGN1cnJlbnRTaXplIDwgbWF4KSB7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=