UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

305 lines 25.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Inject, Injectable } from '@angular/core'; import { map } from 'rxjs/operators'; import { NB_DOCUMENT } from '../../../theme.options'; import { NbFlexibleConnectedPositionStrategy, NbOverlayPositionBuilder, NbPlatform, } from './mapping'; import { NbViewportRulerAdapter } from '../adapter/viewport-ruler-adapter'; import { NbGlobalLogicalPosition } from './position-helper'; import { GlobalPositionStrategy } from '@angular/cdk/overlay'; /** @enum {string} */ const NbAdjustment = { NOOP: 'noop', CLOCKWISE: 'clockwise', COUNTERCLOCKWISE: 'counterclockwise', VERTICAL: 'vertical', HORIZONTAL: 'horizontal', }; export { NbAdjustment }; /** @enum {string} */ const NbPosition = { TOP: 'top', BOTTOM: 'bottom', LEFT: 'left', RIGHT: 'right', START: 'start', END: 'end', }; export { NbPosition }; /** @type {?} */ const POSITIONS = { /** * @param {?} offset * @return {?} */ [NbPosition.RIGHT](offset) { return { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset }; }, /** * @param {?} offset * @return {?} */ [NbPosition.BOTTOM](offset) { return { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset }; }, /** * @param {?} offset * @return {?} */ [NbPosition.LEFT](offset) { return { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset }; }, /** * @param {?} offset * @return {?} */ [NbPosition.TOP](offset) { return { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset }; }, }; /** @type {?} */ const COUNTER_CLOCKWISE_POSITIONS = [NbPosition.TOP, NbPosition.LEFT, NbPosition.BOTTOM, NbPosition.RIGHT]; /** @type {?} */ const NOOP_POSITIONS = [NbPosition.TOP, NbPosition.BOTTOM, NbPosition.LEFT, NbPosition.RIGHT]; /** @type {?} */ const CLOCKWISE_POSITIONS = [NbPosition.TOP, NbPosition.RIGHT, NbPosition.BOTTOM, NbPosition.LEFT]; /** @type {?} */ const VERTICAL_POSITIONS = [NbPosition.BOTTOM, NbPosition.TOP]; /** @type {?} */ const HORIZONTAL_POSITIONS = [NbPosition.START, NbPosition.END]; /** * @param {?} p1 * @param {?} p2 * @return {?} */ function comparePositions(p1, p2) { return p1.originX === p2.originX && p1.originY === p2.originY && p1.overlayX === p2.overlayX && p1.overlayY === p2.overlayY; } /* * The main idea of the adjustable connected strategy is to provide predefined set of positions for your overlay. * You have to provide adjustment and appropriate strategy will be chosen in runtime. * */ export class NbAdjustableConnectedPositionStrategy extends NbFlexibleConnectedPositionStrategy { constructor() { super(...arguments); this._offset = 15; this.positionChange = this.positionChanges.pipe(map((positionChange) => positionChange.connectionPair), map((connectionPair) => { return this.appliedPositions.find(({ connectedPosition }) => { return comparePositions(connectedPosition, connectionPair); }).key; })); } /** * @param {?} overlayRef * @return {?} */ attach(overlayRef) { /* * We have to apply positions before attach because super.attach() validates positions and crashes app * if no positions provided. * */ this.applyPositions(); super.attach(overlayRef); } /** * @return {?} */ apply() { this.applyPositions(); super.apply(); } /** * @template THIS * @this {THIS} * @param {?} position * @return {THIS} */ position(position) { (/** @type {?} */ (this))._position = position; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} adjustment * @return {THIS} */ adjustment(adjustment) { (/** @type {?} */ (this))._adjustment = adjustment; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} offset * @return {THIS} */ offset(offset) { (/** @type {?} */ (this))._offset = offset; return (/** @type {?} */ (this)); } /** * @protected * @return {?} */ applyPositions() { /** @type {?} */ const positions = this.createPositions(); this.persistChosenPositions(positions); this.withPositions(this.appliedPositions.map(({ connectedPosition }) => connectedPosition)); } /** * @protected * @return {?} */ createPositions() { switch (this._adjustment) { case NbAdjustment.NOOP: return NOOP_POSITIONS.filter(position => this._position === position); case NbAdjustment.CLOCKWISE: return this.reorderPreferredPositions(CLOCKWISE_POSITIONS); case NbAdjustment.COUNTERCLOCKWISE: return this.reorderPreferredPositions(COUNTER_CLOCKWISE_POSITIONS); case NbAdjustment.HORIZONTAL: return this.reorderPreferredPositions(HORIZONTAL_POSITIONS); case NbAdjustment.VERTICAL: return this.reorderPreferredPositions(VERTICAL_POSITIONS); } } /** * @protected * @param {?} positions * @return {?} */ persistChosenPositions(positions) { this.appliedPositions = positions.map(position => ({ key: position, connectedPosition: POSITIONS[position](this._offset), })); } /** * @protected * @param {?} positions * @return {?} */ reorderPreferredPositions(positions) { /** @type {?} */ const cpy = positions.slice(); /** @type {?} */ const startIndex = positions.indexOf(this._position); /** @type {?} */ const start = cpy.splice(startIndex); return start.concat(...cpy); } } if (false) { /** * @type {?} * @protected */ NbAdjustableConnectedPositionStrategy.prototype._position; /** * @type {?} * @protected */ NbAdjustableConnectedPositionStrategy.prototype._offset; /** * @type {?} * @protected */ NbAdjustableConnectedPositionStrategy.prototype._adjustment; /** * @type {?} * @protected */ NbAdjustableConnectedPositionStrategy.prototype.appliedPositions; /** @type {?} */ NbAdjustableConnectedPositionStrategy.prototype.positionChange; } export class NbGlobalPositionStrategy extends GlobalPositionStrategy { /** * @template THIS * @this {THIS} * @param {?} position * @return {THIS} */ position(position) { switch (position) { case NbGlobalLogicalPosition.TOP_START: return (/** @type {?} */ (this)).top().left(); case NbGlobalLogicalPosition.TOP_END: return (/** @type {?} */ (this)).top().right(); case NbGlobalLogicalPosition.BOTTOM_START: return (/** @type {?} */ (this)).bottom().left(); case NbGlobalLogicalPosition.BOTTOM_END: return (/** @type {?} */ (this)).bottom().right(); } } } export class NbPositionBuilderService { /** * @param {?} document * @param {?} viewportRuler * @param {?} platform * @param {?} positionBuilder */ constructor(document, viewportRuler, platform, positionBuilder) { this.document = document; this.viewportRuler = viewportRuler; this.platform = platform; this.positionBuilder = positionBuilder; } /** * @return {?} */ global() { return new NbGlobalPositionStrategy(); } /** * @param {?} elementRef * @return {?} */ connectedTo(elementRef) { return new NbAdjustableConnectedPositionStrategy(elementRef, this.viewportRuler, this.document, this.platform) .withFlexibleDimensions(false) .withPush(false); } } NbPositionBuilderService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NbPositionBuilderService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: NbViewportRulerAdapter }, { type: NbPlatform }, { type: NbOverlayPositionBuilder } ]; if (false) { /** * @type {?} * @protected */ NbPositionBuilderService.prototype.document; /** * @type {?} * @protected */ NbPositionBuilderService.prototype.viewportRuler; /** * @type {?} * @protected */ NbPositionBuilderService.prototype.platform; /** * @type {?} * @protected */ NbPositionBuilderService.prototype.positionBuilder; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wb3NpdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Nkay9vdmVybGF5L292ZXJsYXktcG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUlMLG1DQUFtQyxFQUNuQyx3QkFBd0IsRUFFeEIsVUFBVSxHQUVYLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7SUFJNUQsTUFBTyxNQUFNO0lBQ2IsV0FBWSxXQUFXO0lBQ3ZCLGtCQUFtQixrQkFBa0I7SUFDckMsVUFBVyxVQUFVO0lBQ3JCLFlBQWEsWUFBWTs7Ozs7SUFJekIsS0FBTSxLQUFLO0lBQ1gsUUFBUyxRQUFRO0lBQ2pCLE1BQU8sTUFBTTtJQUNiLE9BQVEsT0FBTztJQUNmLE9BQVEsT0FBTztJQUNmLEtBQU0sS0FBSzs7OztNQUdQLFNBQVMsR0FBRzs7Ozs7SUFDaEIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTTtRQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDdkcsQ0FBQzs7Ozs7SUFDRCxDQUFDLFVBQVUsQ0FBQyxN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YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gIE5iQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxyXG4gIE5iQ29ubmVjdGVkUG9zaXRpb24sXHJcbiAgTmJDb25uZWN0aW9uUG9zaXRpb25QYWlyLFxyXG4gIE5iRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE5iT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcclxuICBOYk92ZXJsYXlSZWYsXHJcbiAgTmJQbGF0Zm9ybSxcclxuICBOYlBvc2l0aW9uU3RyYXRlZ3ksXHJcbn0gZnJvbSAnLi9tYXBwaW5nJztcclxuaW1wb3J0IHsgTmJWaWV3cG9ydFJ1bGVyQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXIvdmlld3BvcnQtcnVsZXItYWRhcHRlcic7XHJcbmltcG9ydCB7IE5iR2xvYmFsTG9naWNhbFBvc2l0aW9uIH0gZnJvbSAnLi9wb3NpdGlvbi1oZWxwZXInO1xyXG5pbXBvcnQgeyBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIE5iQWRqdXN0bWVudCB7XHJcbiAgTk9PUCA9ICdub29wJyxcclxuICBDTE9DS1dJU0UgPSAnY2xvY2t3aXNlJyxcclxuICBDT1VOVEVSQ0xPQ0tXSVNFID0gJ2NvdW50ZXJjbG9ja3dpc2UnLFxyXG4gIFZFUlRJQ0FMID0gJ3ZlcnRpY2FsJyxcclxuICBIT1JJWk9OVEFMID0gJ2hvcml6b250YWwnLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBOYlBvc2l0aW9uIHtcclxuICBUT1AgPSAndG9wJyxcclxuICBCT1RUT00gPSAnYm90dG9tJyxcclxuICBMRUZUID0gJ2xlZnQnLFxyXG4gIFJJR0hUID0gJ3JpZ2h0JyxcclxuICBTVEFSVCA9ICdzdGFydCcsXHJcbiAgRU5EID0gJ2VuZCcsXHJcbn1cclxuXHJcbmNvbnN0IFBPU0lUSU9OUyA9IHtcclxuICBbTmJQb3NpdGlvbi5SSUdIVF0ob2Zmc2V0KSB7XHJcbiAgICByZXR1cm4geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IG9mZnNldCB9O1xyXG4gIH0sXHJcbiAgW05iUG9zaXRpb24uQk9UVE9NXShvZmZzZXQpIHtcclxuICAgIHJldHVybiB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IG9mZnNldCB9O1xyXG4gIH0sXHJcbiAgW05iUG9zaXRpb24uTEVGVF0ob2Zmc2V0KSB7XHJcbiAgICByZXR1cm4geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IC1vZmZzZXQgfTtcclxuICB9LFxyXG4gIFtOYlBvc2l0aW9uLlRPUF0ob2Zmc2V0KSB7XHJcbiAgICByZXR1cm4geyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtb2Zmc2V0IH07XHJcbiAgfSxcclxufTtcclxuXHJcbmNvbnN0IENPVU5URVJfQ0xPQ0tXSVNFX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLlRPUCwgTmJQb3NpdGlvbi5MRUZULCBOYlBvc2l0aW9uLkJPVFRPTSwgTmJQb3NpdGlvbi5SSUdIVF07XHJcbmNvbnN0IE5PT1BfUE9TSVRJT05TID0gW05iUG9zaXRpb24uVE9QLCBOYlBvc2l0aW9uLkJPVFRPTSwgTmJQb3NpdGlvbi5MRUZULCBOYlBvc2l0aW9uLlJJR0hUXTtcclxuY29uc3QgQ0xPQ0tXSVNFX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLlRPUCwgTmJQb3NpdGlvbi5SSUdIVCwgTmJQb3NpdGlvbi5CT1RUT00sIE5iUG9zaXRpb24uTEVGVF07XHJcbmNvbnN0IFZFUlRJQ0FMX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLkJPVFRPTSwgTmJQb3NpdGlvbi5UT1BdO1xyXG5jb25zdCBIT1JJWk9OVEFMX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLlNUQVJULCBOYlBvc2l0aW9uLkVORF07XHJcblxyXG5cclxuZnVuY3Rpb24gY29tcGFyZVBvc2l0aW9ucyhwMTogTmJDb25uZWN0ZWRQb3NpdGlvbiwgcDI6IE5iQ29ubmVjdGVkUG9zaXRpb24pOiBib29sZWFuIHtcclxuICByZXR1cm4gcDEub3JpZ2luWCA9PT0gcDIub3JpZ2luWFxyXG4gICAgJiYgcDEub3JpZ2luWSA9PT0gcDIub3JpZ2luWVxyXG4gICAgJiYgcDEub3ZlcmxheVggPT09IHAyLm92ZXJsYXlYXHJcbiAgICAmJiBwMS5vdmVybGF5WSA9PT0gcDIub3ZlcmxheVk7XHJcbn1cclxuXHJcbi8qXHJcbiAqIFRoZSBtYWluIGlkZWEgb2YgdGhlIGFkanVzdGFibGUgY29ubmVjdGVkIHN0cmF0ZWd5IGlzIHRvIHByb3ZpZGUgcHJlZGVmaW5lZCBzZXQgb2YgcG9zaXRpb25zIGZvciB5b3VyIG92ZXJsYXkuXHJcbiAqIFlvdSBoYXZlIHRvIHByb3ZpZGUgYWRqdXN0bWVudCBhbmQgYXBwcm9wcmlhdGUgc3RyYXRlZ3kgd2lsbCBiZSBjaG9zZW4gaW4gcnVudGltZS5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3lcclxuICBleHRlbmRzIE5iRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgTmJQb3NpdGlvblN0cmF0ZWd5IHtcclxuXHJcbiAgcHJvdGVjdGVkIF9wb3NpdGlvbjogTmJQb3NpdGlvbjtcclxuICBwcm90ZWN0ZWQgX29mZnNldDogbnVtYmVyID0gMTU7XHJcbiAgcHJvdGVjdGVkIF9hZGp1c3RtZW50OiBOYkFkanVzdG1lbnQ7XHJcblxyXG4gIHByb3RlY3RlZCBhcHBsaWVkUG9zaXRpb25zOiB7IGtleTogTmJQb3NpdGlvbiwgY29ubmVjdGVkUG9zaXRpb246IE5iQ29ubmVjdGVkUG9zaXRpb24gfVtdO1xyXG5cclxuICByZWFkb25seSBwb3NpdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxOYlBvc2l0aW9uPiA9IHRoaXMucG9zaXRpb25DaGFuZ2VzLnBpcGUoXHJcbiAgICBtYXAoKHBvc2l0aW9uQ2hhbmdlOiBOYkNvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSkgPT4gcG9zaXRpb25DaGFuZ2UuY29ubmVjdGlvblBhaXIpLFxyXG4gICAgbWFwKChjb25uZWN0aW9uUGFpcjogTmJDb25uZWN0aW9uUG9zaXRpb25QYWlyKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcGxpZWRQb3NpdGlvbnMuZmluZCgoeyBjb25uZWN0ZWRQb3NpdGlvbiB9KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVQb3NpdGlvbnMoY29ubmVjdGVkUG9zaXRpb24sIGNvbm5lY3Rpb25QYWlyKTtcclxuICAgICAgfSkua2V5O1xyXG4gICAgfSksXHJcbiAgKTtcclxuXHJcbiAgYXR0YWNoKG92ZXJsYXlSZWY6IE5iT3ZlcmxheVJlZikge1xyXG4gICAgLypcclxuICAgICAqIFdlIGhhdmUgdG8gYXBwbHkgcG9zaXRpb25zIGJlZm9yZSBhdHRhY2ggYmVjYXVzZSBzdXBlci5hdHRhY2goKSB2YWxpZGF0ZXMgcG9zaXRpb25zIGFuZCBjcmFzaGVzIGFwcFxyXG4gICAgICogaWYgbm8gcG9zaXRpb25zIHByb3ZpZGVkLlxyXG4gICAgICogKi9cclxuICAgIHRoaXMuYXBwbHlQb3NpdGlvbnMoKTtcclxuICAgIHN1cGVyLmF0dGFjaChvdmVybGF5UmVmKTtcclxuICB9XHJcblxyXG4gIGFwcGx5KCkge1xyXG4gICAgdGhpcy5hcHBseVBvc2l0aW9ucygpO1xyXG4gICAgc3VwZXIuYXBwbHkoKTtcclxuICB9XHJcblxyXG4gIHBvc2l0aW9uKHBvc2l0aW9uOiBOYlBvc2l0aW9uKTogdGhpcyB7XHJcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBhZGp1c3RtZW50KGFkanVzdG1lbnQ6IE5iQWRqdXN0bWVudCk6IHRoaXMge1xyXG4gICAgdGhpcy5fYWRqdXN0bWVudCA9IGFkanVzdG1lbnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIG9mZnNldChvZmZzZXQ6IG51bWJlcik6IHRoaXMge1xyXG4gICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlQb3NpdGlvbnMoKSB7XHJcbiAgICBjb25zdCBwb3NpdGlvbnM6IE5iUG9zaXRpb25bXSA9IHRoaXMuY3JlYXRlUG9zaXRpb25zKCk7XHJcbiAgICB0aGlzLnBlcnNpc3RDaG9zZW5Qb3NpdGlvbnMocG9zaXRpb25zKTtcclxuICAgIHRoaXMud2l0aFBvc2l0aW9ucyh0aGlzLmFwcGxpZWRQb3NpdGlvbnMubWFwKCh7IGNvbm5lY3RlZFBvc2l0aW9uIH0pID0+IGNvbm5lY3RlZFBvc2l0aW9uKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlUG9zaXRpb25zKCk6IE5iUG9zaXRpb25bXSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX2FkanVzdG1lbnQpIHtcclxuICAgICAgY2FzZSBOYkFkanVzdG1lbnQuTk9PUDpcclxuICAgICAgICByZXR1cm4gTk9PUF9QT1NJVElPTlMuZmlsdGVyKHBvc2l0aW9uID0+IHRoaXMuX3Bvc2l0aW9uID09PSBwb3NpdGlvbik7XHJcbiAgICAgIGNhc2UgTmJBZGp1c3RtZW50LkNMT0NLV0lTRTpcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW9yZGVyUHJlZmVycmVkUG9zaXRpb25zKENMT0NLV0lTRV9QT1NJVElPTlMpO1xyXG4gICAgICBjYXNlIE5iQWRqdXN0bWVudC5DT1VOVEVSQ0xPQ0tXSVNFOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlb3JkZXJQcmVmZXJyZWRQb3NpdGlvbnMoQ09VTlRFUl9DTE9DS1dJU0VfUE9TSVRJT05TKTtcclxuICAgICAgY2FzZSBOYkFkanVzdG1lbnQuSE9SSVpPTlRBTDpcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW9yZGVyUHJlZmVycmVkUG9zaXRpb25zKEhPUklaT05UQUxfUE9TSVRJT05TKTtcclxuICAgICAgY2FzZSBOYkFkanVzdG1lbnQuVkVSVElDQUw6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVvcmRlclByZWZlcnJlZFBvc2l0aW9ucyhWRVJUSUNBTF9QT1NJVElPTlMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHBlcnNpc3RDaG9zZW5Qb3NpdGlvbnMocG9zaXRpb25zOiBOYlBvc2l0aW9uW10pIHtcclxuICAgIHRoaXMuYXBwbGllZFBvc2l0aW9ucyA9IHBvc2l0aW9ucy5tYXAocG9zaXRpb24gPT4gKHtcclxuICAgICAga2V5OiBwb3NpdGlvbixcclxuICAgICAgY29ubmVjdGVkUG9zaXRpb246IFBPU0lUSU9OU1twb3NpdGlvbl0odGhpcy5fb2Zmc2V0KSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW9yZGVyUHJlZmVycmVkUG9zaXRpb25zKHBvc2l0aW9uczogTmJQb3NpdGlvbltdKTogTmJQb3NpdGlvbltdIHtcclxuICAgIGNvbnN0IGNweSA9IHBvc2l0aW9ucy5zbGljZSgpO1xyXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHBvc2l0aW9ucy5pbmRleE9mKHRoaXMuX3Bvc2l0aW9uKTtcclxuICAgIGNvbnN0IHN0YXJ0ID0gY3B5LnNwbGljZShzdGFydEluZGV4KTtcclxuICAgIHJldHVybiBzdGFydC5jb25jYXQoLi4uY3B5KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYkdsb2JhbFBvc2l0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5IHtcclxuXHJcbiAgcG9zaXRpb24ocG9zaXRpb246IE5iR2xvYmFsTG9naWNhbFBvc2l0aW9uKTogdGhpcyB7XHJcbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XHJcbiAgICAgIGNhc2UgTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24uVE9QX1NUQVJUOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnRvcCgpLmxlZnQoKTtcclxuXHJcbiAgICAgIGNhc2UgTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24uVE9QX0VORDpcclxuICAgICAgICByZXR1cm4gdGhpcy50b3AoKS5yaWdodCgpO1xyXG5cclxuICAgICAgY2FzZSBOYkdsb2JhbExvZ2ljYWxQb3NpdGlvbi5CT1RUT01fU1RBUlQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm90dG9tKCkubGVmdCgpO1xyXG5cclxuICAgICAgY2FzZSBOYkdsb2JhbExvZ2ljYWxQb3NpdGlvbi5CT1RUT01fRU5EOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmJvdHRvbSgpLnJpZ2h0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkJfRE9DVU1FTlQpIHByb3RlY3RlZCBkb2N1bWVudCxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdmlld3BvcnRSdWxlcjogTmJWaWV3cG9ydFJ1bGVyQWRhcHRlcixcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IE5iUGxhdGZvcm0sXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHBvc2l0aW9uQnVpbGRlcjogTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyKSB7XHJcbiAgfVxyXG5cclxuICBnbG9iYWwoKTogTmJHbG9iYWxQb3NpdGlvblN0cmF0ZWd5IHtcclxuICAgIHJldHVybiBuZXcgTmJHbG9iYWxQb3NpdGlvblN0cmF0ZWd5KCk7XHJcbiAgfVxyXG5cclxuICBjb25uZWN0ZWRUbyhlbGVtZW50UmVmOiBFbGVtZW50UmVmKTogTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICByZXR1cm4gbmV3IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3koZWxlbWVudFJlZiwgdGhpcy52aWV3cG9ydFJ1bGVyLCB0aGlzLmRvY3VtZW50LCB0aGlzLnBsYXRmb3JtKVxyXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcclxuICAgICAgLndpdGhQdXNoKGZhbHNlKTtcclxuICB9XHJcbn1cclxuIl19