UNPKG

ngx-foldable

Version:

Angular library to help you build dual-screen experiences for foldable or dual-screen devices

169 lines 18.3 kB
import { Directive, Host, HostBinding, Input } from '@angular/core'; import { ScreenSpanning } from './screen-spanning'; import { ReadingDirection, SplitLayoutMode, WindowOrder, } from './split-layout.directive'; import * as i0 from "@angular/core"; import * as i1 from "./screen-context"; import * as i2 from "./split-layout.directive"; /** * Look 'ma, CSS-in-JS with Angular! ಠ_ಠ * * @ignore */ const layoutStyles = { [SplitLayoutMode.Flex]: { [ScreenSpanning.DualHorizontal]: [ { flex: '0 0 env(viewport-segment-width 0 0)' }, { flex: '0 0 env(viewport-segment-width 1 0)' }, ], [ScreenSpanning.DualVertical]: [ { flex: '0 0 env(viewport-segment-height 0 0)' }, { flex: '0 0 env(viewport-segment-height 0 1)' }, ], }, [SplitLayoutMode.Grid]: { [ScreenSpanning.DualHorizontal]: [ { gridArea: 'segment0' }, { gridArea: 'segment1' }, ], [ScreenSpanning.DualVertical]: [ { gridArea: 'segment0', height: 'env(viewport-segment-height 0 0)' }, { gridArea: 'segment1', height: 'env(viewport-segment-height 0 1)' }, ], }, [SplitLayoutMode.Absolute]: { [ScreenSpanning.DualHorizontal]: [ { position: 'absolute', left: 0, width: 'env(viewport-segment-right 0 0)', }, { position: 'absolute', left: 'env(viewport-segment-left 1 0)', right: 0, }, ], [ScreenSpanning.DualVertical]: [ { position: 'absolute', top: 0, width: '100%', maxHeight: 'env(viewport-segment-height 0 0)', }, { position: 'absolute', top: 'env(viewport-segment-top 0 1)', width: '100%', maxHeight: 'env(viewport-segment-height 0 1)', }, ], }, }; /** * This directive is used to set specify on which window segment the container * should be placed on multi screen devices. * * When used on a single screen device, no layout change (CSS) is added. * Only devices with up to two screen are currently supported, meaning that the * window segment value must be either 0 or 1. * * This directive can only be used within a {@link SplitLayoutDirective}. * If {@link SplitLayoutMode} is set to `absolute`, you can assign multiple * container element to the same window segment. * * Note that if you have set the read direction to Right-To-Left mode (`rtl`) * in CSS, the first segment will be the rightmost one. * * If the {@link WindowOrder} option is set to {@link WindowOrder.Reverse}, * the window segments order will be reversed in horizontal spanning mode. * * @example * <div fdSplitLayout="grid"> * <section fdWindow="0">Will be displayed on first screen</section> * <section fdWindow="1">Will be displayed on second screen (if available)</section> * </div> */ export class WindowDirective { constructor(screenContext, splitLayout) { this.screenContext = screenContext; this.splitLayout = splitLayout; this.segment = -1; this.layoutStyle = {}; this.screenContextSubscription = null; this.screenContextSubscription = this.screenContext .asObservable() .subscribe(() => this.updateStyle()); } /** @ignore */ get style() { return this.layoutStyle; } /** * Sets the target window segment to display this container on when multi * screen is detected. * * @param segment The target window segment, must be 0 or 1. */ set fdWindow(segment) { segment = typeof segment === 'string' ? parseInt(segment, 10) : segment; if (segment !== this.segment) { this.segment = segment; this.updateStyle(); } } /** @ignore */ ngOnDestroy() { if (this.screenContextSubscription !== null) { this.screenContextSubscription.unsubscribe(); } } updateStyle() { if (this.segment === -1) { return; } const isMultiScreen = this.screenContext.isMultiScreen; const spanning = this.screenContext.screenSpanning; if (isMultiScreen && spanning !== ScreenSpanning.None) { if (this.segment < 0 || this.segment > 1) { throw new Error('Segment index must be 0 or 1'); } const mode = this.splitLayout.layoutMode; const order = this.splitLayout.windowOrder; const direction = this.splitLayout.readingDirection; // Swap segments for vertical span and RTL mode or // horizontal span and reverse window order const swap = (spanning === ScreenSpanning.DualHorizontal && mode !== SplitLayoutMode.Grid && direction === ReadingDirection.RightToLeft) || (spanning === ScreenSpanning.DualVertical && order === WindowOrder.Reverse); const segment = swap ? 1 - this.segment : this.segment; this.layoutStyle = layoutStyles[mode][spanning][segment]; } else { this.layoutStyle = {}; } } } WindowDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: WindowDirective, deps: [{ token: i1.ScreenContext }, { token: i2.SplitLayoutDirective, host: true }], target: i0.ɵɵFactoryTarget.Directive }); WindowDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.1", type: WindowDirective, selector: "[fdWindow]", inputs: { fdWindow: "fdWindow" }, host: { properties: { "style": "this.style" } }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: WindowDirective, decorators: [{ type: Directive, args: [{ selector: '[fdWindow]', }] }], ctorParameters: function () { return [{ type: i1.ScreenContext }, { type: i2.SplitLayoutDirective, decorators: [{ type: Host }] }]; }, propDecorators: { style: [{ type: HostBinding, args: ['style'] }], fdWindow: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi9zcmMvY29yZS93aW5kb3cuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFJL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsZUFBZSxFQUNmLFdBQVcsR0FDWixNQUFNLDBCQUEwQixDQUFDOzs7O0FBRWxDOzs7O0dBSUc7QUFDSCxNQUFNLFlBQVksR0FBRztJQUNuQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUMvQixFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRTtZQUMvQyxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRTtTQUNoRDtRQUNELENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzdCLEVBQUUsSUFBSSxFQUFFLHNDQUFzQyxFQUFFO1lBQ2hELEVBQUUsSUFBSSxFQUFFLHNDQUFzQyxFQUFFO1NBQ2pEO0tBQ0Y7SUFDRCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUMvQixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7WUFDeEIsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO1NBQ3pCO1FBQ0QsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDN0I7Z0JBQ0UsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSxrQ0FBa0M7YUFDM0M7WUFDRDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLGtDQUFr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Q0FBQyxnQkFBZ0IsQ0FBQztZQUNwRCxrREFBa0Q7WUFDbEQsMkNBQTJDO1lBQzNDLE1BQU0sSUFBSSxHQUNSLENBQUMsUUFBUSxLQUFLLGNBQWMsQ0FBQyxjQUFjO2dCQUN6QyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUk7Z0JBQzdCLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7Z0JBQzdDLENBQUMsUUFBUSxLQUFLLGNBQWMsQ0FBQyxZQUFZO29CQUN2QyxLQUFLLEtBQUssV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUQ7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQzs7NEdBeEVVLGVBQWU7Z0dBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUgzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO2lCQUN2Qjs7MEJBNkJJLElBQUk7NENBckJILEtBQUs7c0JBRFIsV0FBVzt1QkFBQyxPQUFPO2dCQVloQixRQUFRO3NCQURYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3QsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2NyZWVuQ29udGV4dCB9IGZyb20gJy4vc2NyZWVuLWNvbnRleHQnO1xuaW1wb3J0IHsgU2NyZWVuU3Bhbm5pbmcgfSBmcm9tICcuL3NjcmVlbi1zcGFubmluZyc7XG5pbXBvcnQge1xuICBSZWFkaW5nRGlyZWN0aW9uLFxuICBTcGxpdExheW91dERpcmVjdGl2ZSxcbiAgU3BsaXRMYXlvdXRNb2RlLFxuICBXaW5kb3dPcmRlcixcbn0gZnJvbSAnLi9zcGxpdC1sYXlvdXQuZGlyZWN0aXZlJztcblxuLyoqXG4gKiBMb29rICdtYSwgQ1NTLWluLUpTIHdpdGggQW5ndWxhciEg4LKgX+CyoFxuICpcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgbGF5b3V0U3R5bGVzID0ge1xuICBbU3BsaXRMYXlvdXRNb2RlLkZsZXhdOiB7XG4gICAgW1NjcmVlblNwYW5uaW5nLkR1YWxIb3Jpem9udGFsXTogW1xuICAgICAgeyBmbGV4OiAnMCAwIGVudih2aWV3cG9ydC1zZWdtZW50LXdpZHRoIDAgMCknIH0sXG4gICAgICB7IGZsZXg6ICcwIDAgZW52KHZpZXdwb3J0LXNlZ21lbnQtd2lkdGggMSAwKScgfSxcbiAgICBdLFxuICAgIFtTY3JlZW5TcGFubmluZy5EdWFsVmVydGljYWxdOiBbXG4gICAgICB7IGZsZXg6ICcwIDAgZW52KHZpZXdwb3J0LXNlZ21lbnQtaGVpZ2h0IDAgMCknIH0sXG4gICAgICB7IGZsZXg6ICcwIDAgZW52KHZpZXdwb3J0LXNlZ21lbnQtaGVpZ2h0IDAgMSknIH0sXG4gICAgXSxcbiAgfSxcbiAgW1NwbGl0TGF5b3V0TW9kZS5HcmlkXToge1xuICAgIFtTY3JlZW5TcGFubmluZy5EdWFsSG9yaXpvbnRhbF06IFtcbiAgICAgIHsgZ3JpZEFyZWE6ICdzZWdtZW50MCcgfSxcbiAgICAgIHsgZ3JpZEFyZWE6ICdzZWdtZW50MScgfSxcbiAgICBdLFxuICAgIFtTY3JlZW5TcGFubmluZy5EdWFsVmVydGljYWxdOiBbXG4gICAgICB7XG4gICAgICAgIGdyaWRBcmVhOiAnc2VnbWVudDAnLFxuICAgICAgICBoZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAwKSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGdyaWRBcmVhOiAnc2VnbWVudDEnLFxuICAgICAgICBoZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAxKSdcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgW1NwbGl0TGF5b3V0TW9kZS5BYnNvbHV0ZV06IHtcbiAgICBbU2NyZWVuU3Bhbm5pbmcuRHVhbEhvcml6b250YWxdOiBbXG4gICAgICB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogJ2Vudih2aWV3cG9ydC1zZWdtZW50LXJpZ2h0IDAgMCknLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIGxlZnQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1sZWZ0IDEgMCknLFxuICAgICAgICByaWdodDogMCxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbU2NyZWVuU3Bhbm5pbmcuRHVhbFZlcnRpY2FsXTogW1xuICAgICAge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBtYXhIZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAwKScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAnZW52KHZpZXdwb3J0LXNlZ21lbnQtdG9wIDAgMSknLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBtYXhIZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAxKScsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGlzIHVzZWQgdG8gc2V0IHNwZWNpZnkgb24gd2hpY2ggd2luZG93IHNlZ21lbnQgdGhlIGNvbnRhaW5lclxuICogc2hvdWxkIGJlIHBsYWNlZCBvbiBtdWx0aSBzY3JlZW4gZGV2aWNlcy5cbiAqXG4gKiBXaGVuIHVzZWQgb24gYSBzaW5nbGUgc2NyZWVuIGRldmljZSwgbm8gbGF5b3V0IGNoYW5nZSAoQ1NTKSBpcyBhZGRlZC5cbiAqIE9ubHkgZGV2aWNlcyB3aXRoIHVwIHRvIHR3byBzY3JlZW4gYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsIG1lYW5pbmcgdGhhdCB0aGVcbiAqIHdpbmRvdyBzZWdtZW50IHZhbHVlIG11c3QgYmUgZWl0aGVyIDAgb3IgMS5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiBhIHtAbGluayBTcGxpdExheW91dERpcmVjdGl2ZX0uXG4gKiBJZiB7QGxpbmsgU3BsaXRMYXlvdXRNb2RlfSBpcyBzZXQgdG8gYGFic29sdXRlYCwgeW91IGNhbiBhc3NpZ24gbXVsdGlwbGVcbiAqIGNvbnRhaW5lciBlbGVtZW50IHRvIHRoZSBzYW1lIHdpbmRvdyBzZWdtZW50LlxuICpcbiAqIE5vdGUgdGhhdCBpZiB5b3UgaGF2ZSBzZXQgdGhlIHJlYWQgZGlyZWN0aW9uIHRvIFJpZ2h0LVRvLUxlZnQgbW9kZSAoYHJ0bGApXG4gKiBpbiBDU1MsIHRoZSBmaXJzdCBzZWdtZW50IHdpbGwgYmUgdGhlIHJpZ2h0bW9zdCBvbmUuXG4gKlxuICogSWYgdGhlIHtAbGluayBXaW5kb3dPcmRlcn0gb3B0aW9uIGlzIHNldCB0byB7QGxpbmsgV2luZG93T3JkZXIuUmV2ZXJzZX0sXG4gKiB0aGUgd2luZG93IHNlZ21lbnRzIG9yZGVyIHdpbGwgYmUgcmV2ZXJzZWQgaW4gaG9yaXpvbnRhbCBzcGFubmluZyBtb2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGZkU3BsaXRMYXlvdXQ9XCJncmlkXCI+XG4gKiAgICAgICAgICAgICAgPHNlY3Rpb24gZmRXaW5kb3c9XCIwXCI+V2lsbCBiZSBkaXNwbGF5ZWQgb24gZmlyc3Qgc2NyZWVuPC9zZWN0aW9uPlxuICogICAgICAgICAgICAgIDxzZWN0aW9uIGZkV2luZG93PVwiMVwiPldpbGwgYmUgZGlzcGxheWVkIG9uIHNlY29uZCBzY3JlZW4gKGlmIGF2YWlsYWJsZSk8L3NlY3Rpb24+XG4gKiA8L2Rpdj5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZkV2luZG93XScsXG59KVxuZXhwb3J0IGNsYXNzIFdpbmRvd0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc2VnbWVudCA9IC0xO1xuICBwcml2YXRlIGxheW91dFN0eWxlOiBTYWZlU3R5bGUgPSB7fTtcbiAgcHJpdmF0ZSBzY3JlZW5Db250ZXh0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICAvKiogQGlnbm9yZSAqL1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlJylcbiAgZ2V0IHN0eWxlKCk6IFNhZmVTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0U3R5bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGFyZ2V0IHdpbmRvdyBzZWdtZW50IHRvIGRpc3BsYXkgdGhpcyBjb250YWluZXIgb24gd2hlbiBtdWx0aVxuICAgKiBzY3JlZW4gaXMgZGV0ZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWdtZW50IFRoZSB0YXJnZXQgd2luZG93IHNlZ21lbnQsIG11c3QgYmUgMCBvciAxLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGZkV2luZG93KHNlZ21lbnQ6IG51bWJlciB8IHN0cmluZykge1xuICAgIHNlZ21lbnQgPSB0eXBlb2Ygc2VnbWVudCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzZWdtZW50LCAxMCkgOiBzZWdtZW50O1xuICAgIGlmIChzZWdtZW50ICE9PSB0aGlzLnNlZ21lbnQpIHtcbiAgICAgIHRoaXMuc2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY3JlZW5Db250ZXh0OiBTY3JlZW5Db250ZXh0LFxuICAgIEBIb3N0KCkgcHJpdmF0ZSBzcGxpdExheW91dDogU3BsaXRMYXlvdXREaXJlY3RpdmVcbiAgKSB7XG4gICAgdGhpcy5zY3JlZW5Db250ZXh0U3Vic2NyaXB0aW9uID0gdGhpcy5zY3JlZW5Db250ZXh0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTdHlsZSgpKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNjcmVlbkNvbnRleHRTdWJzY3JpcHRpb24gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2NyZWVuQ29udGV4dFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3R5bGUoKSB7XG4gICAgaWYgKHRoaXMuc2VnbWVudCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc011bHRpU2NyZWVuID0gdGhpcy5zY3JlZW5Db250ZXh0LmlzTXVsdGlTY3JlZW47XG4gICAgY29uc3Qgc3Bhbm5pbmcgPSB0aGlzLnNjcmVlbkNvbnRleHQuc2NyZWVuU3Bhbm5pbmc7XG5cbiAgICBpZiAoaXNNdWx0aVNjcmVlbiAmJiBzcGFubmluZyAhPT0gU2NyZWVuU3Bhbm5pbmcuTm9uZSkge1xuICAgICAgaWYgKHRoaXMuc2VnbWVudCA8IDAgfHwgdGhpcy5zZWdtZW50ID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlZ21lbnQgaW5kZXggbXVzdCBiZSAwIG9yIDEnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuc3BsaXRMYXlvdXQubGF5b3V0TW9kZTtcbiAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zcGxpdExheW91dC53aW5kb3dPcmRlcjtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuc3BsaXRMYXlvdXQucmVhZGluZ0RpcmVjdGlvbjtcbiAgICAgIC8vIFN3YXAgc2VnbWVudHMgZm9yIHZlcnRpY2FsIHNwYW4gYW5kIFJUTCBtb2RlIG9yXG4gICAgICAvLyBob3Jpem9udGFsIHNwYW4gYW5kIHJldmVyc2Ugd2luZG93IG9yZGVyXG4gICAgICBjb25zdCBzd2FwID1cbiAgICAgICAgKHNwYW5uaW5nID09PSBTY3JlZW5TcGFubmluZy5EdWFsSG9yaXpvbnRhbCAmJlxuICAgICAgICAgIG1vZGUgIT09IFNwbGl0TGF5b3V0TW9kZS5HcmlkICYmXG4gICAgICAgICAgZGlyZWN0aW9uID09PSBSZWFkaW5nRGlyZWN0aW9uLlJpZ2h0VG9MZWZ0KSB8fFxuICAgICAgICAoc3Bhbm5pbmcgPT09IFNjcmVlblNwYW5uaW5nLkR1YWxWZXJ0aWNhbCAmJlxuICAgICAgICAgIG9yZGVyID09PSBXaW5kb3dPcmRlci5SZXZlcnNlKTtcblxuICAgICAgY29uc3Qgc2VnbWVudCA9IHN3YXAgPyAxIC0gdGhpcy5zZWdtZW50IDogdGhpcy5zZWdtZW50O1xuICAgICAgdGhpcy5sYXlvdXRTdHlsZSA9IGxheW91dFN0eWxlc1ttb2RlXVtzcGFubmluZ11bc2VnbWVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF5b3V0U3R5bGUgPSB7fTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==