@triniwiz/nativescript-pager
Version:
A Carousel/Pager plugin for NativeScript
310 lines • 40.6 kB
JavaScript
import { __decorate } from "tslib";
import { ContentChild, Directive, EventEmitter, Host, Inject, InjectionToken, Input, Output, TemplateRef, ViewChild, ViewContainerRef, ɵisListLikeIterable as isListLikeIterable, } from "@angular/core";
import { isIOS } from "@nativescript/core";
import { LayoutBase, Trace, profile, ObservableArray } from "@nativescript/core";
import { getSingleViewRecursive, isInvisibleNode, registerElement, } from "@nativescript/angular";
import { Pager, PagerError, PagerItem, PagerLog, } from "@triniwiz/nativescript-pager";
import * as i0 from "@angular/core";
registerElement("Pager", () => Pager);
registerElement("PagerItem", () => PagerItem);
const NG_VIEW = "_ngViewRef";
export class ItemContext {
constructor($implicit, item, index, even, odd) {
this.$implicit = $implicit;
this.item = item;
this.index = index;
this.even = even;
this.odd = odd;
}
}
export class TemplatedItemsComponent {
constructor(_elementRef, _iterableDiffers, zone) {
this._iterableDiffers = _iterableDiffers;
this.zone = zone;
this.setupItemView = new EventEmitter();
this.templatedItemsView = _elementRef.nativeElement;
this.templatedItemsView.on("itemLoading", this.onItemLoading, this);
this.templatedItemsView.on("itemDisposing", this.onItemDisposing, this);
}
get items() {
return this._items;
}
set items(value) {
this._items = value;
let needDiffer = true;
if (value instanceof ObservableArray) {
needDiffer = false;
}
if (needDiffer && !this._differ && isListLikeIterable(value)) {
this._differ = this._iterableDiffers
.find(this._items)
.create((_index, item) => {
return item;
});
}
this.templatedItemsView.items = this._items;
}
get selectedIndex() {
return this._selectedIndex;
}
set selectedIndex(value) {
this._selectedIndex = value;
this.templatedItemsView.selectedIndex = this._selectedIndex;
}
ngAfterViewInit() {
if (!!(this._selectedIndex)) {
setTimeout(() => {
if (isIOS) {
this.templatedItemsView.scrollToIndexAnimated(this._selectedIndex, false);
}
this.templatedItemsView.selectedIndex = this._selectedIndex;
});
}
}
ngAfterContentInit() {
if (Trace.isEnabled()) {
PagerLog("TemplatedItemsView.ngAfterContentInit()");
}
this.setItemTemplates();
}
ngOnDestroy() {
this.templatedItemsView.off("itemLoading", this.onItemLoading, this);
this.templatedItemsView.off("itemDisposing", this.onItemDisposing, this);
}
setItemTemplates() {
if (!this.items)
return;
// The itemTemplateQuery may be changed after list items are added that contain <template> inside,
// so cache and use only the original template to avoid errors.
this.itemTemplate = this.itemTemplateQuery;
if (this._templateMap) {
if (Trace.isEnabled()) {
PagerLog("Setting templates");
}
const templates = [];
this._templateMap.forEach((value) => {
templates.push(value);
});
this.templatedItemsView.itemTemplates = templates;
}
}
registerTemplate(key, template) {
if (Trace.isEnabled()) {
PagerLog(`registerTemplate for key: ${key}`);
}
if (!this._templateMap) {
this._templateMap = new Map();
}
const keyedTemplate = {
key,
createView: this.getItemTemplateViewFactory(template),
};
this._templateMap.set(key, keyedTemplate);
}
onItemLoading(args) {
if (!args.view && !this.itemTemplate) {
return;
}
if (!this.items)
return;
const index = args.index;
const items = args.object.items;
const currentItem = typeof items.getItem === "function"
? items.getItem(index)
: items[index];
let viewRef;
if (args.view) {
if (Trace.isEnabled()) {
PagerLog(`onItemLoading: ${index} - Reusing existing view`);
}
viewRef = args.view[NG_VIEW];
// Getting angular view from original element (in cases when ProxyViewContainer
// is used NativeScript internally wraps it in a StackLayout)
if (!viewRef &&
args.view instanceof LayoutBase &&
args.view.getChildrenCount() > 0) {
viewRef = args.view.getChildAt(0)[NG_VIEW];
}
if (!viewRef && Trace.isEnabled()) {
PagerError(`ViewReference not found for item ${index}. View recycling is not working`);
}
}
if (!viewRef) {
if (Trace.isEnabled()) {
PagerLog(`onItemLoading: ${index} - Creating view from template`);
}
viewRef = this.loader.createEmbeddedView(this.itemTemplate, new ItemContext(), 0);
args.view = getItemViewRoot(viewRef);
args.view[NG_VIEW] = viewRef;
}
this.setupViewRef(viewRef, currentItem, index);
this.detectChangesOnChild(viewRef, index);
}
onItemDisposing(args) {
if (!args.view) {
return;
}
let viewRef;
if (args.view) {
if (Trace.isEnabled()) {
PagerLog(`onItemDisposing: ${args.index} - Removing angular view`);
}
viewRef = args.view[NG_VIEW];
// Getting angular view from original element (in cases when ProxyViewContainer
// is used NativeScript internally wraps it in a StackLayout)
if (!viewRef &&
args.view instanceof LayoutBase &&
args.view.getChildrenCount() > 0) {
viewRef = args.view.getChildAt(0)[NG_VIEW];
}
if (!viewRef && Trace.isEnabled()) {
PagerError(`ViewReference not found for item ${args.index}. View disposing is not working`);
}
}
if (viewRef) {
if (Trace.isEnabled()) {
PagerLog(`onItemDisposing: ${args.index} - Disposing view reference`);
}
viewRef.destroy();
}
}
setupViewRef(viewRef, data, index) {
const context = viewRef.context;
context.$implicit = data;
context.item = data;
context.index = index;
context.even = index % 2 === 0;
context.odd = !context.even;
this.setupItemView.next({
view: viewRef,
data: data,
index: index,
context: context,
});
}
getItemTemplateViewFactory(template) {
return () => {
const viewRef = this.loader.createEmbeddedView(template, new ItemContext(), 0);
const resultView = getItemViewRoot(viewRef);
resultView[NG_VIEW] = viewRef;
return resultView;
};
}
detectChangesOnChild(viewRef, index) {
if (Trace.isEnabled()) {
PagerLog(`Manually detect changes in child: ${index}`);
}
this.zone.run(() => {
viewRef.markForCheck();
viewRef.detectChanges();
});
}
ngDoCheck() {
if (this._differ) {
if (Trace.isEnabled()) {
PagerLog("ngDoCheck() - execute differ");
}
const changes = this._differ.diff(this._items);
if (changes) {
if (Trace.isEnabled()) {
PagerLog("ngDoCheck() - refresh");
}
this.templatedItemsView.refresh();
}
}
}
}
TemplatedItemsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: TemplatedItemsComponent, deps: [{ token: i0.ElementRef }, { token: i0.IterableDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
TemplatedItemsComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.2", type: TemplatedItemsComponent, inputs: { items: "items", selectedIndex: "selectedIndex" }, outputs: { setupItemView: "setupItemView" }, queries: [{ propertyName: "itemTemplateQuery", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "loader", first: true, predicate: ["loader"], descendants: true, read: ViewContainerRef }], ngImport: i0 });
__decorate([
profile
], TemplatedItemsComponent.prototype, "onItemLoading", null);
__decorate([
profile
], TemplatedItemsComponent.prototype, "onItemDisposing", null);
__decorate([
profile
], TemplatedItemsComponent.prototype, "detectChangesOnChild", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: TemplatedItemsComponent, decorators: [{
type: Directive
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.IterableDiffers }, { type: i0.NgZone }]; }, propDecorators: { loader: [{
type: ViewChild,
args: ["loader", { read: ViewContainerRef, static: false }]
}], setupItemView: [{
type: Output
}], itemTemplateQuery: [{
type: ContentChild,
args: [TemplateRef, { static: false }]
}], items: [{
type: Input
}], selectedIndex: [{
type: Input
}], onItemLoading: [], onItemDisposing: [], detectChangesOnChild: [] } });
export function getItemViewRoot(viewRef, rootLocator = getSingleViewRecursive) {
return rootLocator(viewRef.rootNodes, 0);
}
export const TEMPLATED_ITEMS_COMPONENT = new InjectionToken("TemplatedItemsComponent");
export class PagerItemDirective {
constructor(templateRef, owner, viewContainer) {
this.templateRef = templateRef;
this.owner = owner;
this.viewContainer = viewContainer;
}
ensureItem() {
if (!this.item) {
this.item = new PagerItem();
}
}
applyConfig() {
this.ensureItem();
}
ngOnInit() {
this.applyConfig();
const viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
// Filter out text nodes and comments
const realViews = viewRef.rootNodes.filter((node) => !isInvisibleNode(node));
if (realViews.length > 0) {
const view = realViews[0];
this.item.addChild(view);
this.owner.nativeElement._addChildFromBuilder("PagerItem", this.item);
}
}
}
PagerItemDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: PagerItemDirective, deps: [{ token: i0.TemplateRef }, { token: TEMPLATED_ITEMS_COMPONENT, host: true }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
PagerItemDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.2", type: PagerItemDirective, selector: "[pagerItem]", ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: PagerItemDirective, decorators: [{
type: Directive,
args: [{
selector: "[pagerItem]",
}]
}], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: TemplatedItemsComponent, decorators: [{
type: Inject,
args: [TEMPLATED_ITEMS_COMPONENT]
}, {
type: Host
}] }, { type: i0.ViewContainerRef }]; } });
export class TemplateKeyDirective {
constructor(templateRef, comp) {
this.templateRef = templateRef;
this.comp = comp;
}
set pagerTemplateKey(value) {
if (this.comp && this.templateRef) {
this.comp.registerTemplate(value, this.templateRef);
}
}
}
TemplateKeyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: TemplateKeyDirective, deps: [{ token: i0.TemplateRef }, { token: TEMPLATED_ITEMS_COMPONENT, host: true }], target: i0.ɵɵFactoryTarget.Directive });
TemplateKeyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.2", type: TemplateKeyDirective, selector: "[pagerTemplateKey]", inputs: { pagerTemplateKey: "pagerTemplateKey" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: TemplateKeyDirective, decorators: [{
type: Directive,
args: [{ selector: "[pagerTemplateKey]" }]
}], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: TemplatedItemsComponent, decorators: [{
type: Inject,
args: [TEMPLATED_ITEMS_COMPONENT]
}, {
type: Host
}] }]; }, propDecorators: { pagerTemplateKey: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXItaXRlbXMtY29tcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25hdGl2ZXNjcmlwdC1wYWdlci9hbmd1bGFyL3BhZ2VyLWl0ZW1zLWNvbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFHTCxZQUFZLEVBQ1osU0FBUyxFQUlULFlBQVksRUFDWixJQUFJLEVBQ0osTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBTUwsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLG1CQUFtQixJQUFJLGtCQUFrQixHQUMxQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUF1QixNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBYSxVQUFVLEVBQVksS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQTZCLE1BQU0sb0JBQW9CLENBQUM7QUFFakksT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFDTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEdBQ1QsTUFBTSw4QkFBOEIsQ0FBQzs7QUFFdEMsZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QyxlQUFlLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztBQWtDN0IsTUFBTSxPQUFPLFdBQVc7SUFDdEIsWUFDUyxTQUFlLEVBQ2YsSUFBVSxFQUNWLEtBQWMsRUFDZCxJQUFjLEVBQ2QsR0FBYTtRQUpiLGNBQVMsR0FBVCxTQUFTLENBQU07UUFDZixTQUFJLEdBQUosSUFBSSxDQUFNO1FBQ1YsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUNkLFNBQUks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QyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDM0MsV0FBVyxFQUNYLElBQUksQ0FBQyxJQUFJLENBQ1YsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7K0dBdENVLGtCQUFrQiw2Q0FLbkIseUJBQXlCO21HQUx4QixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtpQkFDeEI7OzBCQU1JLE1BQU07MkJBQUMseUJBQXlCOzswQkFDaEMsSUFBSTs7QUFvQ1QsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixZQUNVLFdBQTZCLEVBRzdCLElBQTZCO1FBSDdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUc3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtJQUNuQyxDQUFDO0lBRUwsSUFDSSxnQkFBZ0IsQ0FBQyxLQUFVO1FBQzdCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNyRDtJQUNILENBQUM7O2lIQWJVLG9CQUFvQiw2Q0FHckIseUJBQXlCO3FHQUh4QixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFEaEMsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRTs7MEJBSXhDLE1BQU07MkJBQUMseUJBQXlCOzswQkFDaEMsSUFBSTs0Q0FLSCxnQkFBZ0I7c0JBRG5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRGlyZWN0aXZlLFxuICBEb0NoZWNrLFxuICBFbGVtZW50UmVmLFxuICBFbWJlZGRlZFZpZXdSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIEl0ZXJhYmxlRGlmZmVyLFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgybVpc0xpc3RMaWtlSXRlcmFibGUgYXMgaXNMaXN0TGlrZUl0ZXJhYmxlLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgaXNJT1MsIEtleWVkVGVtcGxhdGUsIFZpZXcgfSBmcm9tIFwiQG5hdGl2ZXNjcmlwdC9jb3JlXCI7XG5pbXBvcnQgeyBFdmVudERhdGEsIExheW91dEJhc2UsIFRlbXBsYXRlLCBUcmFjZSwgcHJvZmlsZSwgT2JzZXJ2YWJsZUFycmF5LCBJdGVtRXZlbnREYXRhLEl0ZW1zU291cmNlIH0gZnJvbSBcIkBuYXRpdmVzY3JpcHQvY29yZVwiO1xuXG5pbXBvcnQge1xuICBnZXRTaW5nbGVWaWV3UmVjdXJzaXZlLFxuICBpc0ludmlzaWJsZU5vZGUsXG4gIHJlZ2lzdGVyRWxlbWVudCxcbn0gZnJvbSBcIkBuYXRpdmVzY3JpcHQvYW5ndWxhclwiO1xuXG5pbXBvcnQge1xuICBQYWdlcixcbiAgUGFnZXJFcnJvcixcbiAgUGFnZXJJdGVtLFxuICBQYWdlckxvZyxcbn0gZnJvbSBcIkB0cmluaXdpei9uYXRpdmVzY3JpcHQtcGFnZXJcIjtcblxucmVnaXN0ZXJFbGVtZW50KFwiUGFnZXJcIiwgKCkgPT4gUGFnZXIpO1xucmVnaXN0ZXJFbGVtZW50KFwiUGFnZXJJdGVtXCIsICgpID0+IFBhZ2VySXRlbSk7XG5cbmNvbnN0IE5HX1ZJRVcgPSBcIl9uZ1ZpZXdSZWZcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlclRlbXBsYXRlZEl0ZW1zVmlldyB7XG4gIGl0ZW1zOiBhbnlbXSB8IEl0ZW1zU291cmNlO1xuICBpdGVtVGVtcGxhdGU6IHN0cmluZyB8IFRlbXBsYXRlO1xuICBpdGVtVGVtcGxhdGVzPzogc3RyaW5nIHwgQXJyYXk8S2V5ZWRUZW1wbGF0ZT47XG5cbiAgcmVmcmVzaCgpOiB2b2lkO1xuXG4gIG9uKFxuICAgIGV2ZW50OiBcIml0ZW1Mb2FkaW5nXCIsXG4gICAgY2FsbGJhY2s6IChhcmdzOiBJdGVtRXZlbnREYXRhKSA9PiB2b2lkLFxuICAgIHRoaXNBcmc/OiBhbnlcbiAgKTtcblxuICBvbihcbiAgICBldmVudDogXCJpdGVtRGlzcG9zaW5nXCIsXG4gICAgY2FsbGJhY2s6IChhcmdzOiBJdGVtRXZlbnREYXRhKSA9PiB2b2lkLFxuICAgIHRoaXNBcmc/OiBhbnlcbiAgKTtcblxuICBvZmYoXG4gICAgZXZlbnQ6IFwiaXRlbUxvYWRpbmdcIixcbiAgICBjYWxsYmFjazogKGFyZ3M6IEV2ZW50RGF0YSkgPT4gdm9pZCxcbiAgICB0aGlzQXJnPzogYW55XG4gICk7XG5cbiAgb2ZmKFxuICAgIGV2ZW50OiBcIml0ZW1EaXNwb3NpbmdcIixcbiAgICBjYWxsYmFjazogKGFyZ3M6IEV2ZW50RGF0YSkgPT4gdm9pZCxcbiAgICB0aGlzQXJnPzogYW55XG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyAkaW1wbGljaXQ/OiBhbnksXG4gICAgcHVibGljIGl0ZW0/OiBhbnksXG4gICAgcHVibGljIGluZGV4PzogbnVtYmVyLFxuICAgIHB1YmxpYyBldmVuPzogYm9vbGVhbixcbiAgICBwdWJsaWMgb2RkPzogYm9vbGVhblxuICApIHsgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHVwSXRlbVZpZXdBcmdzIHtcbiAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG4gIGRhdGE6IGFueTtcbiAgaW5kZXg6IG51bWJlcjtcbiAgY29udGV4dDogSXRlbUNvbnRleHQ7XG59XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRlbXBsYXRlZEl0ZW1zQ29tcG9uZW50XG4gIGltcGxlbWVudHMgRG9DaGVjaywgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHVibGljIGFic3RyYWN0IGdldCBuYXRpdmVFbGVtZW50KCk6IFBhZ2VyO1xuXG4gIHByb3RlY3RlZCB0ZW1wbGF0ZWRJdGVtc1ZpZXc6IFBhZ2VyO1xuICBwcm90ZWN0ZWQgX2l0ZW1zOiBhbnk7XG4gIHByb3RlY3RlZCBfZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxLZXllZFRlbXBsYXRlPjtcbiAgcHJvdGVjdGVkIF90ZW1wbGF0ZU1hcDogTWFwPHN0cmluZywgS2V5ZWRUZW1wbGF0ZT47XG4gIHByaXZhdGUgX3NlbGVjdGVkSW5kZXg6IG51bWJlcjtcbiAgQFZpZXdDaGlsZChcImxvYWRlclwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgbG9hZGVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2V0dXBJdGVtVmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8U2V0dXBJdGVtVmlld0FyZ3M+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGl0ZW1UZW1wbGF0ZVF1ZXJ5OiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD47XG5cbiAgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD47XG5cbiAgQElucHV0KClcbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIHNldCBpdGVtcyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5faXRlbXMgPSB2YWx1ZTtcbiAgICBsZXQgbmVlZERpZmZlciA9IHRydWU7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZUFycmF5KSB7XG4gICAgICBuZWVkRGlmZmVyID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZWVkRGlmZmVyICYmICF0aGlzLl9kaWZmZXIgJiYgaXNMaXN0TGlrZUl0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5faXRlcmFibGVEaWZmZXJzXG4gICAgICAgIC5maW5kKHRoaXMuX2l0ZW1zKVxuICAgICAgICAuY3JlYXRlKChfaW5kZXgsIGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcuaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RlZEluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSW5kZXg7XG4gIH1cblxuICBzZXQgc2VsZWN0ZWRJbmRleCh2YWx1ZSkge1xuICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSB2YWx1ZTtcbiAgICB0aGlzLnRlbXBsYXRlZEl0ZW1zVmlldy5zZWxlY3RlZEluZGV4ID0gdGhpcy5fc2VsZWN0ZWRJbmRleDtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAoISEodGhpcy5fc2VsZWN0ZWRJbmRleCkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoaXNJT1MpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlZEl0ZW1zVmlldy5zY3JvbGxUb0luZGV4QW5pbWF0ZWQoXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4LFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGVtcGxhdGVkSXRlbXNWaWV3LnNlbGVjdGVkSW5kZXggPSB0aGlzLl9zZWxlY3RlZEluZGV4O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcgPSBfZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcub24oXCJpdGVtTG9hZGluZ1wiLCB0aGlzLm9uSXRlbUxvYWRpbmcsIHRoaXMpO1xuICAgIHRoaXMudGVtcGxhdGVkSXRlbXNWaWV3Lm9uKFwiaXRlbURpc3Bvc2luZ1wiLCB0aGlzLm9uSXRlbURpc3Bvc2luZywgdGhpcyk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICBQYWdlckxvZyhcIlRlbXBsYXRlZEl0ZW1zVmlldy5uZ0FmdGVyQ29udGVudEluaXQoKVwiKTtcbiAgICB9XG4gICAgdGhpcy5zZXRJdGVtVGVtcGxhdGVzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnRlbXBsYXRlZEl0ZW1zVmlldy5vZmYoXCJpdGVtTG9hZGluZ1wiLCB0aGlzLm9uSXRlbUxvYWRpbmcsIHRoaXMpO1xuICAgIHRoaXMudGVtcGxhdGVkSXRlbXNWaWV3Lm9mZihcbiAgICAgIFwiaXRlbURpc3Bvc2luZ1wiLFxuICAgICAgdGhpcy5vbkl0ZW1EaXNwb3NpbmcsXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXRlbVRlbXBsYXRlcygpIHtcbiAgICBpZiAoIXRoaXMuaXRlbXMpIHJldHVybjtcbiAgICAvLyBUaGUgaXRlbVRlbXBsYXRlUXVlcnkgbWF5IGJlIGNoYW5nZWQgYWZ0ZXIgbGlzdCBpdGVtcyBhcmUgYWRkZWQgdGhhdCBjb250YWluIDx0ZW1wbGF0ZT4gaW5zaWRlLFxuICAgIC8vIHNvIGNhY2hlIGFuZCB1c2Ugb25seSB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgdG8gYXZvaWQgZXJyb3JzLlxuICAgIHRoaXMuaXRlbVRlbXBsYXRlID0gdGhpcy5pdGVtVGVtcGxhdGVRdWVyeTtcblxuICAgIGlmICh0aGlzLl90ZW1wbGF0ZU1hcCkge1xuICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIFBhZ2VyTG9nKFwiU2V0dGluZyB0ZW1wbGF0ZXNcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlczogS2V5ZWRUZW1wbGF0ZVtdID0gW107XG4gICAgICB0aGlzLl90ZW1wbGF0ZU1hcC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICB0ZW1wbGF0ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGVtcGxhdGVkSXRlbXNWaWV3Lml0ZW1UZW1wbGF0ZXMgPSB0ZW1wbGF0ZXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyVGVtcGxhdGUoa2V5OiBzdHJpbmcsIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pIHtcbiAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgIFBhZ2VyTG9nKGByZWdpc3RlclRlbXBsYXRlIGZvciBrZXk6ICR7a2V5fWApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGVtcGxhdGVNYXApIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEtleWVkVGVtcGxhdGU+KCk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ZWRUZW1wbGF0ZSA9IHtcbiAgICAgIGtleSxcbiAgICAgIGNyZWF0ZVZpZXc6IHRoaXMuZ2V0SXRlbVRlbXBsYXRlVmlld0ZhY3RvcnkodGVtcGxhdGUpLFxuICAgIH07XG5cbiAgICB0aGlzLl90ZW1wbGF0ZU1hcC5zZXQoa2V5LCBrZXllZFRlbXBsYXRlKTtcbiAgfVxuXG4gIEBwcm9maWxlXG4gIHB1YmxpYyBvbkl0ZW1Mb2FkaW5nKGFyZ3M6IEl0ZW1FdmVudERhdGEpIHtcbiAgICBpZiAoIWFyZ3MudmlldyAmJiAhdGhpcy5pdGVtVGVtcGxhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXRlbXMpIHJldHVybjtcblxuICAgIGNvbnN0IGluZGV4ID0gYXJncy5pbmRleDtcbiAgICBjb25zdCBpdGVtcyA9ICg8YW55PmFyZ3Mub2JqZWN0KS5pdGVtcztcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9XG4gICAgICB0eXBlb2YgaXRlbXMuZ2V0SXRlbSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gaXRlbXMuZ2V0SXRlbShpbmRleClcbiAgICAgICAgOiBpdGVtc1tpbmRleF07XG4gICAgbGV0IHZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD47XG5cbiAgICBpZiAoYXJncy52aWV3KSB7XG4gICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgUGFnZXJMb2coYG9uSXRlbUxvYWRpbmc6ICR7aW5kZXh9IC0gUmV1c2luZyBleGlzdGluZyB2aWV3YCk7XG4gICAgICB9XG5cbiAgICAgIHZpZXdSZWYgPSBhcmdzLnZpZXdbTkdfVklFV107XG4gICAgICAvLyBHZXR0aW5nIGFuZ3VsYXIgdmlldyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgKGluIGNhc2VzIHdoZW4gUHJveHlWaWV3Q29udGFpbmVyXG4gICAgICAvLyBpcyB1c2VkIE5hdGl2ZVNjcmlwdCBpbnRlcm5hbGx5IHdyYXBzIGl0IGluIGEgU3RhY2tMYXlvdXQpXG4gICAgICBpZiAoXG4gICAgICAgICF2aWV3UmVmICYmXG4gICAgICAgIGFyZ3MudmlldyBpbnN0YW5jZW9mIExheW91dEJhc2UgJiZcbiAgICAgICAgYXJncy52aWV3LmdldENoaWxkcmVuQ291bnQoKSA+IDBcbiAgICAgICkge1xuICAgICAgICB2aWV3UmVmID0gYXJncy52aWV3LmdldENoaWxkQXQoMClbTkdfVklFV107XG4gICAgICB9XG5cbiAgICAgIGlmICghdmlld1JlZiAmJiBUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICBQYWdlckVycm9yKFxuICAgICAgICAgIGBWaWV3UmVmZXJlbmNlIG5vdCBmb3VuZCBmb3IgaXRlbSAke2luZGV4fS4gVmlldyByZWN5Y2xpbmcgaXMgbm90IHdvcmtpbmdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2aWV3UmVmKSB7XG4gICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgUGFnZXJMb2coXG4gICAgICAgICAgYG9uSXRlbUxvYWRpbmc6ICR7aW5kZXh9IC0gQ3JlYXRpbmcgdmlldyBmcm9tIHRlbXBsYXRlYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB2aWV3UmVmID0gdGhpcy5sb2FkZXIuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICB0aGlzLml0ZW1UZW1wbGF0ZSxcbiAgICAgICAgbmV3IEl0ZW1Db250ZXh0KCksXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICBhcmdzLnZpZXcgPSBnZXRJdGVtVmlld1Jvb3Qodmlld1JlZik7XG4gICAgICBhcmdzLnZpZXdbTkdfVklFV10gPSB2aWV3UmVmO1xuICAgIH1cblxuICAgIHRoaXMuc2V0dXBWaWV3UmVmKHZpZXdSZWYsIGN1cnJlbnRJdGVtLCBpbmRleCk7XG5cbiAgICB0aGlzLmRldGVjdENoYW5nZXNPbkNoaWxkKHZpZXdSZWYsIGluZGV4KTtcbiAgfVxuXG4gIEBwcm9maWxlXG4gIHB1YmxpYyBvbkl0ZW1EaXNwb3NpbmcoYXJnczogSXRlbUV2ZW50RGF0YSkge1xuICAgIGlmICghYXJncy52aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+O1xuXG4gICAgaWYgKGFyZ3Mudmlldykge1xuICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIFBhZ2VyTG9nKFxuICAgICAgICAgIGBvbkl0ZW1EaXNwb3Npbmc6ICR7YXJncy5pbmRleH0gLSBSZW1vdmluZyBhbmd1bGFyIHZpZXdgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHZpZXdSZWYgPSBhcmdzLnZpZXdbTkdfVklFV107XG4gICAgICAvLyBHZXR0aW5nIGFuZ3VsYXIgdmlldyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgKGluIGNhc2VzIHdoZW4gUHJveHlWaWV3Q29udGFpbmVyXG4gICAgICAvLyBpcyB1c2VkIE5hdGl2ZVNjcmlwdCBpbnRlcm5hbGx5IHdyYXBzIGl0IGluIGEgU3RhY2tMYXlvdXQpXG4gICAgICBpZiAoXG4gICAgICAgICF2aWV3UmVmICYmXG4gICAgICAgIGFyZ3MudmlldyBpbnN0YW5jZW9mIExheW91dEJhc2UgJiZcbiAgICAgICAgYXJncy52aWV3LmdldENoaWxkcmVuQ291bnQoKSA+IDBcbiAgICAgICkge1xuICAgICAgICB2aWV3UmVmID0gYXJncy52aWV3LmdldENoaWxkQXQoMClbTkdfVklFV107XG4gICAgICB9XG5cbiAgICAgIGlmICghdmlld1JlZiAmJiBUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICBQYWdlckVycm9yKFxuICAgICAgICAgIGBWaWV3UmVmZXJlbmNlIG5vdCBmb3VuZCBmb3IgaXRlbSAke2FyZ3MuaW5kZXh9LiBWaWV3IGRpc3Bvc2luZyBpcyBub3Qgd29ya2luZ2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlld1JlZikge1xuICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIFBhZ2VyTG9nKFxuICAgICAgICAgIGBvbkl0ZW1EaXNwb3Npbmc6ICR7YXJncy5pbmRleH0gLSBEaXNwb3NpbmcgdmlldyByZWZlcmVuY2VgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHZpZXdSZWYuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFZpZXdSZWYoXG4gICAgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PixcbiAgICBkYXRhOiBhbnksXG4gICAgaW5kZXg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdmlld1JlZi5jb250ZXh0O1xuICAgIGNvbnRleHQuJGltcGxpY2l0ID0gZGF0YTtcbiAgICBjb250ZXh0Lml0ZW0gPSBkYXRhO1xuICAgIGNvbnRleHQuaW5kZXggPSBpbmRleDtcbiAgICBjb250ZXh0LmV2ZW4gPSBpbmRleCAlIDIgPT09IDA7XG4gICAgY29udGV4dC5vZGQgPSAhY29udGV4dC5ldmVuO1xuXG4gICAgdGhpcy5zZXR1cEl0ZW1WaWV3Lm5leHQoe1xuICAgICAgdmlldzogdmlld1JlZixcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEl0ZW1UZW1wbGF0ZVZpZXdGYWN0b3J5KFxuICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD5cbiAgKTogKCkgPT4gVmlldyB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLmxvYWRlci5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICAgIHRlbXBsYXRlLFxuICAgICAgICBuZXcgSXRlbUNvbnRleHQoKSxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdFZpZXcgPSBnZXRJdGVtVmlld1Jvb3Qodmlld1JlZik7XG4gICAgICByZXN1bHRWaWV3W05HX1ZJRVddID0gdmlld1JlZjtcblxuICAgICAgcmV0dXJuIHJlc3VsdFZpZXc7XG4gICAgfTtcbiAgfVxuXG4gIEBwcm9maWxlXG4gIHByaXZhdGUgZGV0ZWN0Q2hhbmdlc09uQ2hpbGQoXG4gICAgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PixcbiAgICBpbmRleDogbnVtYmVyXG4gICkge1xuICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgUGFnZXJMb2coYE1hbnVhbGx5IGRldGVjdCBjaGFuZ2VzIGluIGNoaWxkOiAke2luZGV4fWApO1xuICAgIH1cblxuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdmlld1JlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pXG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMuX2RpZmZlcikge1xuICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIFBhZ2VyTG9nKFwibmdEb0NoZWNrKCkgLSBleGVjdXRlIGRpZmZlclwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX2l0ZW1zKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgIFBhZ2VyTG9nKFwibmdEb0NoZWNrKCkgLSByZWZyZXNoXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcucmVmcmVzaCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFZpZXcge1xuICByb290Tm9kZXM6IEFycmF5PGFueT47XG5cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBSb290TG9jYXRvciA9IChub2RlczogQXJyYXk8YW55PiwgbmVzdExldmVsOiBudW1iZXIpID0+IFZpZXc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtVmlld1Jvb3QoXG4gIHZpZXdSZWY6IENvbXBvbmVudFZpZXcsXG4gIHJvb3RMb2NhdG9yOiBSb290TG9jYXRvciA9IGdldFNpbmdsZVZpZXdSZWN1cnNpdmUgYXMgYW55XG4pOiBWaWV3IHtcbiAgcmV0dXJuIHJvb3RMb2NhdG9yKHZpZXdSZWYucm9vdE5vZGVzLCAwKTtcbn1cblxuZXhwb3J0IGNvbnN0IFRFTVBMQVRFRF9JVEVNU19DT01QT05FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48XG4gIFRlbXBsYXRlZEl0ZW1zQ29tcG9uZW50XG4+KFwiVGVtcGxhdGVkSXRlbXNDb21wb25lbnRcIik7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbcGFnZXJJdGVtXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBQYWdlckl0ZW1EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGl0ZW06IFBhZ2VySXRlbTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIEBJbmplY3QoVEVNUExBVEVEX0lURU1TX0NPTVBPTkVOVClcbiAgICBASG9zdCgpXG4gICAgcHJpdmF0ZSBvd25lcjogVGVtcGxhdGVkSXRlbXNDb21wb25lbnQsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmXG4gICkgeyB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVJdGVtKCkge1xuICAgIGlmICghdGhpcy5pdGVtKSB7XG4gICAgICB0aGlzLml0ZW0gPSBuZXcgUGFnZXJJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUNvbmZpZygpIHtcbiAgICB0aGlzLmVuc3VyZUl0ZW0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYXBwbHlDb25maWcoKTtcblxuICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYpO1xuICAgIC8vIEZpbHRlciBvdXQgdGV4dCBub2RlcyBhbmQgY29tbWVudHNcbiAgICBjb25zdCByZWFsVmlld3MgPSB2aWV3UmVmLnJvb3ROb2Rlcy5maWx0ZXIoXG4gICAgICAobm9kZSkgPT4gIWlzSW52aXNpYmxlTm9kZShub2RlKVxuICAgICk7XG5cbiAgICBpZiAocmVhbFZpZXdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHZpZXcgPSByZWFsVmlld3NbMF07XG4gICAgICB0aGlzLml0ZW0uYWRkQ2hpbGQodmlldyk7XG4gICAgICB0aGlzLm93bmVyLm5hdGl2ZUVsZW1lbnQuX2FkZENoaWxkRnJvbUJ1aWxkZXIoXG4gICAgICAgIFwiUGFnZXJJdGVtXCIsXG4gICAgICAgIHRoaXMuaXRlbVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiBcIltwYWdlclRlbXBsYXRlS2V5XVwiIH0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVLZXlEaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIEBJbmplY3QoVEVNUExBVEVEX0lURU1TX0NPTVBPTkVOVClcbiAgICBASG9zdCgpXG4gICAgcHJpdmF0ZSBjb21wOiBUZW1wbGF0ZWRJdGVtc0NvbXBvbmVudFxuICApIHsgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBwYWdlclRlbXBsYXRlS2V5KHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5jb21wICYmIHRoaXMudGVtcGxhdGVSZWYpIHtcbiAgICAgIHRoaXMuY29tcC5yZWdpc3RlclRlbXBsYXRlKHZhbHVlLCB0aGlzLnRlbXBsYXRlUmVmKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==