angular-duo-pane
Version:
A library for Angular projects to easily add a two pane view for desktops, foldables and dual screen devices.
149 lines • 19.7 kB
JavaScript
var DuoPaneInformationService_1;
import { __awaiter, __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { Segment } from '../models/Segment';
import * as i0 from "@angular/core";
let DuoPaneInformationService = DuoPaneInformationService_1 = class DuoPaneInformationService {
constructor() {
this.Spanning = 'none';
this.FoldSize = 0;
this.BrowserShellSize = 0;
this.Segments = null;
this.needsDispatch = false;
this.Spanning = sessionStorage.getItem(`${DuoPaneInformationService_1.ns}-spanning`) || 'none';
this.FoldSize = +sessionStorage.getItem(`${DuoPaneInformationService_1.ns}-fold-size`) || 0;
this.BrowserShellSize = +sessionStorage.getItem(`${DuoPaneInformationService_1.ns}-browser-shell-size`) || 0;
this.eventTarget = document.createDocumentFragment();
// Web-based emulator runs this polyfill in an iframe, we need to
// communicate emulator state changes to the site.
// Should only be registered once (in CSS or JS polyfill, not both).
window.addEventListener('message', ev => {
if (ev.data.action === 'update') {
Object.assign(this, ev.data.value);
}
});
window.addEventListener('resize', () => this.debounce(this.invalidate(), 200));
}
addEventListener(type, listener, options) {
this.eventTarget.addEventListener(type, listener, options);
}
removeEventListener(type, callback, options) {
this.eventTarget.removeEventListener(type, callback, options);
}
dispatchEvent(event) {
if (event.type !== 'change') {
return;
}
const methodName = `on${event.type}`;
if (typeof this[methodName] === 'function') {
this[methodName](event);
}
return this.eventTarget.dispatchEvent(event);
}
get foldSize() {
return this.FoldSize;
}
set foldSize(foldSize) {
sessionStorage.setItem(`${DuoPaneInformationService_1.ns}-fold-size`, foldSize.toString());
this.FoldSize = foldSize;
this.invalidate();
}
get browserShellSize() {
return this.BrowserShellSize;
}
set browserShellSize(browserShellSize) {
sessionStorage.setItem(`${DuoPaneInformationService_1.ns}-browser-shell-size`, browserShellSize.toString());
this.BrowserShellSize = browserShellSize;
this.invalidate();
}
get spanning() {
return this.Spanning;
}
set spanning(spanning) {
sessionStorage.setItem(`${DuoPaneInformationService_1.ns}-spanning`, spanning);
this.Spanning = spanning;
this.invalidate();
}
set segments(segments) {
this.Segments = segments;
}
getTwoLargestSegments() {
const segments = this.windowSegments;
if (segments.length > 2) {
const twoLargestSegments = [null, null];
let largestSize = 0;
for (const segment of segments) {
const segmentSize = segment.height * segment.width;
if (segmentSize >= largestSize) {
largestSize = segmentSize;
twoLargestSegments[0] = twoLargestSegments[1];
twoLargestSegments[1] = segment;
}
}
return twoLargestSegments;
}
else {
return segments;
}
}
get windowSegments() {
// TODO: replace with window.getWindowSegments() once it is a web standard
if (this.Segments !== null && this.Segments.length > 0) {
return this.Segments;
}
if (this.spanning === 'none') {
return [
new Segment(window.innerWidth, window.innerHeight, 0, 0)
];
}
if (this.spanning === 'single-fold-horizontal') {
const screenCenter = (window.innerHeight - this.browserShellSize) / 2;
const width = window.innerWidth;
return [
new Segment(width, screenCenter - this.foldSize / 2, 0, 0),
new Segment(width, this.foldSize, screenCenter - this.foldSize / 2, 0),
new Segment(width, window.innerHeight, screenCenter + this.foldSize / 2, 0)
];
}
if (this.spanning === 'single-fold-vertical') {
const width = window.innerWidth / 2 - this.foldSize / 2;
const height = window.innerHeight;
return [
new Segment(width, height, 0, 0),
new Segment(this.foldSize, height, 0, width),
new Segment(width, height, 0, window.innerWidth / 2 + this.foldSize / 2)
];
}
}
/**
* Returns a function that won't call `fn` if it was invoked at a
* faster interval than `wait`.
*/
debounce(fn, wait) {
let timeout;
return () => {
clearTimeout(timeout);
timeout = setTimeout(function () {
fn.apply(this, arguments);
}, wait);
};
}
invalidate() {
return __awaiter(this, void 0, void 0, function* () {
if (!this.needsDispatch) {
this.needsDispatch = true;
this.needsDispatch = yield Promise.resolve(false);
this.dispatchEvent(new Event('change'));
}
});
}
};
DuoPaneInformationService.ns = '__foldables__';
DuoPaneInformationService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DuoPaneInformationService_Factory() { return new DuoPaneInformationService(); }, token: DuoPaneInformationService, providedIn: "root" });
DuoPaneInformationService = DuoPaneInformationService_1 = __decorate([
Injectable({
providedIn: 'root'
})
], DuoPaneInformationService);
export { DuoPaneInformationService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVvLXBhbmUtaW5mb3JtYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZHVvLXBhbmUvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZHVvLXBhbmUtaW5mb3JtYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUs1QyxJQUFhLHlCQUF5QixpQ0FBdEMsTUFBYSx5QkFBeUI7SUFXcEM7UUFSUSxhQUFRLEdBQWlCLE1BQU0sQ0FBQztRQUNoQyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IscUJBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLGFBQVEsR0FBZSxJQUFJLENBQUM7UUFDNUIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFNNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsMkJBQXlCLENBQUMsRUFBRSxXQUFXLENBQWlCLElBQUksTUFBTSxDQUFDO1FBQzdHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsMkJBQXlCLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLDJCQUF5QixDQUFDLEVBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0csSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVyRCxpRUFBaUU7UUFDakUsa0RBQWtEO1FBQ2xELG9FQUFvRTtRQUNwRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3RDLElBQUksRUFBRSxDQUFDLElBQUks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QUFDLENBQUM7SUFDSixDQUFDO0lBQ1ksVUFBVTs7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1FBQ0gsQ0FBQztLQUFBO0NBRUYsQ0FBQTtBQTlKd0IsNEJBQUUsR0FBRyxlQUFlLENBQUM7O0FBRmpDLHlCQUF5QjtJQUhyQyxVQUFVLENBQUM7UUFDVixVQUFVLEVBQUUsTUFBTTtLQUNuQixDQUFDO0dBQ1cseUJBQXlCLENBZ0tyQztTQWhLWSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTcGFubmluZ01vZGUgfSBmcm9tICcuLi9tb2RlbHMvU3Bhbm5pbmdNb2RlJztcbmltcG9ydCB7IElTZWdtZW50IH0gZnJvbSAnLi4vbW9kZWxzL0lTZWdtZW50JztcbmltcG9ydCB7IFNlZ21lbnQgfSBmcm9tICcuLi9tb2RlbHMvU2VnbWVudCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIER1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2Uge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbnMgPSAnX19mb2xkYWJsZXNfXyc7XG4gIHByaXZhdGUgU3Bhbm5pbmc6IFNwYW5uaW5nTW9kZSA9ICdub25lJztcbiAgcHJpdmF0ZSBGb2xkU2l6ZSA9IDA7XG4gIHByaXZhdGUgQnJvd3NlclNoZWxsU2l6ZSA9IDA7XG4gIHByaXZhdGUgU2VnbWVudHM6IElTZWdtZW50W10gPSBudWxsO1xuICBwcml2YXRlIG5lZWRzRGlzcGF0Y2ggPSBmYWxzZTtcbiAgcHJpdmF0ZSBldmVudFRhcmdldDogRG9jdW1lbnRGcmFnbWVudDtcblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgdGhpcy5TcGFubmluZyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oYCR7RHVvUGFuZUluZm9ybWF0aW9uU2VydmljZS5uc30tc3Bhbm5pbmdgKSBhcyBTcGFubmluZ01vZGUgfHwgJ25vbmUnO1xuICAgIHRoaXMuRm9sZFNpemUgPSArc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShgJHtEdW9QYW5lSW5mb3JtYXRpb25TZXJ2aWNlLm5zfS1mb2xkLXNpemVgKSB8fCAwO1xuICAgIHRoaXMuQnJvd3NlclNoZWxsU2l6ZSA9ICtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGAke0R1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UubnN9LWJyb3dzZXItc2hlbGwtc2l6ZWApIHx8IDA7XG5cbiAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgLy8gV2ViLWJhc2VkIGVtdWxhdG9yIHJ1bnMgdGhpcyBwb2x5ZmlsbCBpbiBhbiBpZnJhbWUsIHdlIG5lZWQgdG9cbiAgICAvLyBjb21tdW5pY2F0ZSBlbXVsYXRvciBzdGF0ZSBjaGFuZ2VzIHRvIHRoZSBzaXRlLlxuICAgIC8vIFNob3VsZCBvbmx5IGJlIHJlZ2lzdGVyZWQgb25jZSAoaW4gQ1NTIG9yIEpTIHBvbHlmaWxsLCBub3QgYm90aCkuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldiA9PiB7XG4gICAgICBpZiAoZXYuZGF0YS5hY3Rpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZXYuZGF0YS52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuZGVib3VuY2UodGhpcy5pbnZhbGlkYXRlKCksIDIwMCkpO1xuXG4gIH1cblxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogc3RyaW5nLCBjYWxsYmFjazogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgb3B0aW9ucyk7XG4gIH1cblxuXG5cbiAgcHVibGljIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGV2ZW50LnR5cGUgIT09ICdjaGFuZ2UnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBgb24ke2V2ZW50LnR5cGV9YDtcbiAgICBpZiAodHlwZW9mIHRoaXNbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbbWV0aG9kTmFtZV0oZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ldmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9sZFNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5Gb2xkU2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZm9sZFNpemUoZm9sZFNpemU6IG51bWJlcikge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYCR7RHVvUGFuZUluZm9ybWF0aW9uU2VydmljZS5uc30tZm9sZC1zaXplYCwgZm9sZFNpemUudG9TdHJpbmcoKSk7XG4gICAgdGhpcy5Gb2xkU2l6ZSA9IGZvbGRTaXplO1xuICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuXG4gIH1cblxuICBwdWJsaWMgZ2V0IGJyb3dzZXJTaGVsbFNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5Ccm93c2VyU2hlbGxTaXplO1xuICB9XG5cbiAgcHVibGljIHNldCBicm93c2VyU2hlbGxTaXplKGJyb3dzZXJTaGVsbFNpemU6IG51bWJlcikge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYCR7RHVvUGFuZUluZm9ybWF0aW9uU2VydmljZS5uc30tYnJvd3Nlci1zaGVsbC1zaXplYCwgYnJvd3NlclNoZWxsU2l6ZS50b1N0cmluZygpKTtcbiAgICB0aGlzLkJyb3dzZXJTaGVsbFNpemUgPSBicm93c2VyU2hlbGxTaXplO1xuICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBzcGFubmluZygpOiBTcGFubmluZ01vZGUge1xuICAgIHJldHVybiB0aGlzLlNwYW5uaW5nO1xuICB9XG5cbiAgcHVibGljIHNldCBzcGFubmluZyhzcGFubmluZzogU3Bhbm5pbmdNb2RlKSB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShgJHtEdW9QYW5lSW5mb3JtYXRpb25TZXJ2aWNlLm5zfS1zcGFubmluZ2AsIHNwYW5uaW5nKTtcbiAgICB0aGlzLlNwYW5uaW5nID0gc3Bhbm5pbmc7XG4gICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gIH1cblxuXG4gIHB1YmxpYyBzZXQgc2VnbWVudHMoc2VnbWVudHM6IElTZWdtZW50W10pIHtcbiAgICB0aGlzLlNlZ21lbnRzID0gc2VnbWVudHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHdvTGFyZ2VzdFNlZ21lbnRzKCk6IElTZWdtZW50W10ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy53aW5kb3dTZWdtZW50cztcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID4gMikge1xuICAgICAgY29uc3QgdHdvTGFyZ2VzdFNlZ21lbnRzID0gW251bGwsIG51bGxdO1xuICAgICAgbGV0IGxhcmdlc3RTaXplID0gMDtcbiAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgICAgICBjb25zdCBzZWdtZW50U2l6ZSA9IHNlZ21lbnQuaGVpZ2h0ICogc2VnbWVudC53aWR0aDtcbiAgICAgICAgaWYgKHNlZ21lbnRTaXplID49IGxhcmdlc3RTaXplKSB7XG4gICAgICAgICAgbGFyZ2VzdFNpemUgPSBzZWdtZW50U2l6ZTtcbiAgICAgICAgICB0d29MYXJnZXN0U2VnbWVudHNbMF0gPSB0d29MYXJnZXN0U2VnbWVudHNbMV07XG4gICAgICAgICAgdHdvTGFyZ2VzdFNlZ21lbnRzWzFdID0gc2VnbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR3b0xhcmdlc3RTZWdtZW50cztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlZ21lbnRzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgd2luZG93U2VnbWVudHMoKTogSVNlZ21lbnRbXSB7XG4gICAgLy8gVE9ETzogcmVwbGFjZSB3aXRoIHdpbmRvdy5nZXRXaW5kb3dTZWdtZW50cygpIG9uY2UgaXQgaXMgYSB3ZWIgc3RhbmRhcmRcbiAgICBpZiAodGhpcy5TZWdtZW50cyAhPT0gbnVsbCAmJiB0aGlzLlNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLlNlZ21lbnRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5zcGFubmluZyA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBuZXcgU2VnbWVudCh3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCAwLCAwKVxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3Bhbm5pbmcgPT09ICdzaW5nbGUtZm9sZC1ob3Jpem9udGFsJykge1xuICAgICAgY29uc3Qgc2NyZWVuQ2VudGVyID0gKHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuYnJvd3NlclNoZWxsU2l6ZSkgLyAyO1xuICAgICAgY29uc3Qgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIG5ldyBTZWdtZW50KHdpZHRoLCBzY3JlZW5DZW50ZXIgLSB0aGlzLmZvbGRTaXplIC8gMiwgMCwgMCksXG4gICAgICAgIG5ldyBTZWdtZW50KHdpZHRoLCB0aGlzLmZvbGRTaXplLCBzY3JlZW5DZW50ZXIgLSB0aGlzLmZvbGRTaXplIC8gMiwgMCksXG4gICAgICAgIG5ldyBTZWdtZW50KHdpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQsIHNjcmVlbkNlbnRlciArIHRoaXMuZm9sZFNpemUgLyAyLCAwKVxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3Bhbm5pbmcgPT09ICdzaW5nbGUtZm9sZC12ZXJ0aWNhbCcpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLyAyIC0gdGhpcy5mb2xkU2l6ZSAvIDI7XG4gICAgICBjb25zdCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBuZXcgU2VnbWVudCh3aWR0aCwgaGVpZ2h0LCAwLCAwKSxcbiAgICAgICAgbmV3IFNlZ21lbnQodGhpcy5mb2xkU2l6ZSwgaGVpZ2h0LCAwLCB3aWR0aCksXG4gICAgICAgIG5ldyBTZWdtZW50KHdpZHRoLCBoZWlnaHQsIDAsIHdpbmRvdy5pbm5lcldpZHRoIC8gMiArIHRoaXMuZm9sZFNpemUgLyAyKVxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3b24ndCBjYWxsIGBmbmAgaWYgaXQgd2FzIGludm9rZWQgYXQgYVxuICAgKiBmYXN0ZXIgaW50ZXJ2YWwgdGhhbiBgd2FpdGAuXG4gICAqL1xuICBwdWJsaWMgZGVib3VuY2UoZm46IGFueSwgd2FpdDogbnVtYmVyKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSwgd2FpdCk7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgYXN5bmMgaW52YWxpZGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMubmVlZHNEaXNwYXRjaCkge1xuICAgICAgdGhpcy5uZWVkc0Rpc3BhdGNoID0gdHJ1ZTtcbiAgICAgIHRoaXMubmVlZHNEaXNwYXRjaCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnKSk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==