@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
182 lines • 32.6 kB
JavaScript
import { __extends } from "tslib";
import { VerticalAlignment, HorizontalAlignment, Util } from '../services/overlay/utilities';
import { fadeOut, fadeIn } from '../animations/main';
import { isIE } from '../core/utils';
import { BaseFitPositionStrategy } from '../services/overlay/position/base-fit-position-strategy';
/** @hidden @internal */
var SelectPositioningStrategy = /** @class */ (function (_super) {
__extends(SelectPositioningStrategy, _super);
function SelectPositioningStrategy(select, settings) {
var _this = _super.call(this) || this;
_this.select = select;
_this._selectDefaultSettings = {
horizontalDirection: HorizontalAlignment.Right,
verticalDirection: VerticalAlignment.Bottom,
horizontalStartPoint: HorizontalAlignment.Left,
verticalStartPoint: VerticalAlignment.Top,
openAnimation: fadeIn,
closeAnimation: fadeOut
};
// Global variables required for cases of !initialCall (page scroll/overlay repositionAll)
_this.global_yOffset = 0;
_this.global_xOffset = 0;
_this.global_styles = {};
_this.settings = Object.assign({}, _this._selectDefaultSettings, settings);
return _this;
}
/** @inheritdoc */
SelectPositioningStrategy.prototype.position = function (contentElement, size, document, initialCall) {
var rects = _super.prototype.calculateElementRectangles.call(this, contentElement);
// selectFit obj, to be used for both cases of initialCall and !initialCall(page scroll/overlay repositionAll)
var selectFit = {
verticalOffset: this.global_yOffset,
horizontalOffset: this.global_xOffset,
targetRect: rects.targetRect,
contentElementRect: rects.elementRect,
styles: this.global_styles,
scrollContainer: this.select.scrollContainer,
scrollContainerRect: this.select.scrollContainer.getBoundingClientRect()
};
if (initialCall) {
// Fill in the required selectFit object properties.
selectFit.viewPortRect = Util.getViewportRect(document);
selectFit.itemElement = this.getInteractionItemElement();
selectFit.itemRect = selectFit.itemElement.getBoundingClientRect();
// Calculate input and selected item elements style related variables
selectFit.styles = this.calculateStyles(selectFit);
selectFit.scrollAmount = this.calculateScrollAmount(selectFit);
// Calculate how much to offset the overlay container.
this.calculateYoffset(selectFit);
this.calculateXoffset(selectFit);
_super.prototype.updateViewPortFit.call(this, selectFit);
// container does not fit in viewPort and is out on Top or Bottom
if (selectFit.fitVertical.back < 0 || selectFit.fitVertical.forward < 0) {
this.fitInViewport(contentElement, selectFit);
}
this.select.scrollContainer.scrollTop = selectFit.scrollAmount;
}
this.setStyles(contentElement, selectFit);
};
/**
* Calculate selected item scroll position.
*/
SelectPositioningStrategy.prototype.calculateScrollAmount = function (selectFit) {
var itemElementRect = selectFit.itemRect;
var scrollContainer = selectFit.scrollContainer;
var scrollContainerRect = selectFit.scrollContainerRect;
var scrollDelta = scrollContainerRect.top - itemElementRect.top;
var scrollPosition = scrollContainer.scrollTop - scrollDelta;
var dropDownHeight = scrollContainer.clientHeight;
scrollPosition -= dropDownHeight / 2;
scrollPosition += itemElementRect.height / 2;
return Math.round(Math.min(Math.max(0, scrollPosition), scrollContainer.scrollHeight - scrollContainerRect.height));
};
/**
* Position the items outer container so selected item text is positioned over input text and if header
* And/OR footer - both header/footer are visible
* @param selectFit selectFit to use for computation.
*/
SelectPositioningStrategy.prototype.fitInViewport = function (contentElement, selectFit) {
var footer = selectFit.scrollContainerRect.bottom - selectFit.contentElementRect.bottom;
var header = selectFit.scrollContainerRect.top - selectFit.contentElementRect.top;
var lastItemFitSize = selectFit.targetRect.bottom + selectFit.styles.itemTextToInputTextDiff - footer;
var firstItemFitSize = selectFit.targetRect.top - selectFit.styles.itemTextToInputTextDiff - header;
// out of viewPort on Top
if (selectFit.fitVertical.back < 0) {
var possibleScrollAmount = selectFit.scrollContainer.scrollHeight -
selectFit.scrollContainerRect.height - selectFit.scrollAmount;
if (possibleScrollAmount + selectFit.fitVertical.back > 0 && firstItemFitSize > selectFit.viewPortRect.top) {
selectFit.scrollAmount -= selectFit.fitVertical.back;
selectFit.verticalOffset -= selectFit.fitVertical.back;
this.global_yOffset = selectFit.verticalOffset;
}
else {
selectFit.verticalOffset = 0;
this.global_yOffset = 0;
}
// out of viewPort on Bottom
}
else if (selectFit.fitVertical.forward < 0) {
if (selectFit.scrollAmount + selectFit.fitVertical.forward > 0 && lastItemFitSize < selectFit.viewPortRect.bottom) {
selectFit.scrollAmount += selectFit.fitVertical.forward;
selectFit.verticalOffset += selectFit.fitVertical.forward;
this.global_yOffset = selectFit.verticalOffset;
}
else {
selectFit.verticalOffset = -selectFit.contentElementRect.height + selectFit.targetRect.height;
this.global_yOffset = selectFit.verticalOffset;
}
}
};
/**
* Sets element's style which effectively positions the provided element
* @param element Element to position
* @param selectFit selectFit to use for computation.
* @param initialCall should be true if this is the initial call to the position method calling setStyles
*/
SelectPositioningStrategy.prototype.setStyles = function (contentElement, selectFit) {
_super.prototype.setStyle.call(this, contentElement, selectFit.targetRect, selectFit.contentElementRect, selectFit);
contentElement.style.width = selectFit.styles.contentElementNewWidth + "px"; // manage container based on paddings?
this.global_styles.contentElementNewWidth = selectFit.styles.contentElementNewWidth;
};
/**
* Calculate the necessary input and selected item styles to be used for positioning item text over input text.
* Calculate & Set default items container width.
* @param selectFit selectFit to use for computation.
*/
SelectPositioningStrategy.prototype.calculateStyles = function (selectFit) {
var styles = {};
var inputElementStyles = window.getComputedStyle(this.settings.target);
var itemElementStyles = window.getComputedStyle(selectFit.itemElement);
var numericInputFontSize = parseFloat(inputElementStyles.fontSize);
var numericItemFontSize = parseFloat(itemElementStyles.fontSize);
var inputTextToInputTop = (selectFit.targetRect.bottom - selectFit.targetRect.top - numericInputFontSize) / 2;
var itemTextToItemTop = (selectFit.itemRect.height - numericItemFontSize) / 2;
// Adjust for input top padding
var negateInputPaddings = (parseFloat(inputElementStyles.paddingTop) -
parseFloat(inputElementStyles.paddingBottom)) / 2;
styles.itemTextToInputTextDiff = Math.round(itemTextToItemTop - inputTextToInputTop + negateInputPaddings);
var numericLeftPadding = parseFloat(itemElementStyles.paddingLeft);
var numericTextIndent = parseFloat(itemElementStyles.textIndent);
styles.itemTextPadding = numericLeftPadding;
styles.itemTextIndent = numericTextIndent;
// 24 is the input's toggle ddl icon width
styles.contentElementNewWidth = selectFit.targetRect.width + 24 + numericLeftPadding * 2;
return styles;
};
/**
* Obtain the selected item if there is such one or otherwise use the first one
*/
SelectPositioningStrategy.prototype.getInteractionItemElement = function () {
var itemElement;
if (this.select.selectedItem) {
itemElement = this.select.selectedItem.element.nativeElement;
// D.P. Feb 22 2019, #3921 Force item scroll before measuring in IE11, due to base scrollToItem delay
if (isIE()) {
this.select.scrollContainer.scrollTop = this.select.calculateScrollPosition(this.select.selectedItem);
}
}
else {
itemElement = this.select.getFirstItemElement();
}
return itemElement;
};
/**
* Calculate how much to offset the overlay container for Y-axis.
*/
SelectPositioningStrategy.prototype.calculateYoffset = function (selectFit) {
selectFit.verticalOffset = -(selectFit.itemRect.top - selectFit.contentElementRect.top +
selectFit.styles.itemTextToInputTextDiff - selectFit.scrollAmount);
this.global_yOffset = selectFit.verticalOffset;
};
/**
* Calculate how much to offset the overlay container for X-axis.
*/
SelectPositioningStrategy.prototype.calculateXoffset = function (selectFit) {
selectFit.horizontalOffset = selectFit.styles.itemTextIndent - selectFit.styles.itemTextPadding;
this.global_xOffset = selectFit.horizontalOffset;
};
return SelectPositioningStrategy;
}(BaseFitPositionStrategy));
export { SelectPositioningStrategy };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXBvc2l0aW9uaW5nLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZWxlY3Qvc2VsZWN0LXBvc2l0aW9uaW5nLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQTBCLElBQUksRUFBaUIsTUFBTSwrQkFBK0IsQ0FBQztBQUVwSSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFFbEcsd0JBQXdCO0FBQ3hCO0lBQStDLDZDQUF1QjtJQWNsRSxtQ0FBbUIsTUFBcUIsRUFBRSxRQUEyQjtRQUFyRSxZQUNJLGlCQUFPLFNBRVY7UUFIa0IsWUFBTSxHQUFOLE1BQU0sQ0FBZTtRQVpoQyw0QkFBc0IsR0FBRztZQUM3QixtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLO1lBQzlDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLE1BQU07WUFDM0Msb0JBQW9CLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtZQUM5QyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHO1lBQ3pDLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLGNBQWMsRUFBRSxPQUFPO1NBQzFCLENBQUM7UUFVRiwwRkFBMEY7UUFDbEYsb0JBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsb0JBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsbUJBQWEsR0FBaUIsRUFBRSxDQUFDO1FBTnJDLEtBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSSxDQUFDLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDOztJQUM3RSxDQUFDO0lB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Q0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQ2hHLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0lBQ3JELENBQUM7SUFDTCxnQ0FBQztBQUFELENBQUMsQUE5TEQsQ0FBK0MsdUJBQXVCLEdBOExyRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlcnRpY2FsQWxpZ25tZW50LCBIb3Jpem9udGFsQWxpZ25tZW50LCBQb3NpdGlvblNldHRpbmdzLCBTaXplLCBVdGlsLCBDb25uZWN0ZWRGaXQgIH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSVBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uJztcbmltcG9ydCB7IGZhZGVPdXQsIGZhZGVJbiB9IGZyb20gJy4uL2FuaW1hdGlvbnMvbWFpbic7XG5pbXBvcnQgeyBJZ3hTZWxlY3RCYXNlIH0gZnJvbSAnLi9zZWxlY3QuY29tbW9uJztcbmltcG9ydCB7IGlzSUUgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEJhc2VGaXRQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS9wb3NpdGlvbi9iYXNlLWZpdC1wb3NpdGlvbi1zdHJhdGVneSc7XG5cbi8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdFBvc2l0aW9uaW5nU3RyYXRlZ3kgZXh0ZW5kcyBCYXNlRml0UG9zaXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIElQb3NpdGlvblN0cmF0ZWd5IHtcblxuICAgIHByaXZhdGUgX3NlbGVjdERlZmF1bHRTZXR0aW5ncyA9IHtcbiAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Ub3AsXG4gICAgICAgIG9wZW5BbmltYXRpb246IGZhZGVJbixcbiAgICAgICAgY2xvc2VBbmltYXRpb246IGZhZGVPdXRcbiAgICB9O1xuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgcHVibGljIHNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHNlbGVjdDogSWd4U2VsZWN0QmFzZSwgc2V0dGluZ3M/OiBQb3NpdGlvblNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9zZWxlY3REZWZhdWx0U2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBHbG9iYWwgdmFyaWFibGVzIHJlcXVpcmVkIGZvciBjYXNlcyBvZiAhaW5pdGlhbENhbGwgKHBhZ2Ugc2Nyb2xsL292ZXJsYXkgcmVwb3NpdGlvbkFsbClcbiAgICBwcml2YXRlIGdsb2JhbF95T2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGdsb2JhbF94T2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGdsb2JhbF9zdHlsZXM6IFNlbGVjdFN0eWxlcyA9IHt9O1xuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgcG9zaXRpb24oY29udGVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzaXplOiBTaXplLCBkb2N1bWVudD86IERvY3VtZW50LCBpbml0aWFsQ2FsbD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVjdHMgPSBzdXBlci5jYWxjdWxhdGVFbGVtZW50UmVjdGFuZ2xlcyhjb250ZW50RWxlbWVudCk7XG4gICAgICAgIC8vIHNlbGVjdEZpdCBvYmosIHRvIGJlIHVzZWQgZm9yIGJvdGggY2FzZXMgb2YgaW5pdGlhbENhbGwgYW5kICFpbml0aWFsQ2FsbChwYWdlIHNjcm9sbC9vdmVybGF5IHJlcG9zaXRpb25BbGwpXG4gICAgICAgIGNvbnN0IHNlbGVjdEZpdDogU2VsZWN0Rml0ID0ge1xuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IHRoaXMuZ2xvYmFsX3lPZmZzZXQsXG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiB0aGlzLmdsb2JhbF94T2Zmc2V0LFxuICAgICAgICAgICAgdGFyZ2V0UmVjdDogcmVjdHMudGFyZ2V0UmVjdCxcbiAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50UmVjdDogcmVjdHMuZWxlbWVudFJlY3QsXG4gICAgICAgICAgICBzdHlsZXM6IHRoaXMuZ2xvYmFsX3N0eWxlcyxcbiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lcjogdGhpcy5zZWxlY3Quc2Nyb2xsQ29udGFpbmVyLFxuICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyUmVjdDogdGhpcy5zZWxlY3Quc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGluaXRpYWxDYWxsKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSByZXF1aXJlZCBzZWxlY3RGaXQgb2JqZWN0IHByb3BlcnRpZXMuXG4gICAgICAgICAgICBzZWxlY3RGaXQudmlld1BvcnRSZWN0ID0gVXRpbC5nZXRWaWV3cG9ydFJlY3QoZG9jdW1lbnQpO1xuICAgICAgICAgICAgc2VsZWN0Rml0Lml0ZW1FbGVtZW50ID0gdGhpcy5nZXRJbnRlcmFjdGlvbkl0ZW1FbGVtZW50KCk7XG4gICAgICAgICAgICBzZWxlY3RGaXQuaXRlbVJlY3QgPSBzZWxlY3RGaXQuaXRlbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBpbnB1dCBhbmQgc2VsZWN0ZWQgaXRlbSBlbGVtZW50cyBzdHlsZSByZWxhdGVkIHZhcmlhYmxlc1xuICAgICAgICAgICAgc2VsZWN0Rml0LnN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlU3R5bGVzKHNlbGVjdEZpdCk7XG5cbiAgICAgICAgICAgIHNlbGVjdEZpdC5zY3JvbGxBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVNjcm9sbEFtb3VudChzZWxlY3RGaXQpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHRvIG9mZnNldCB0aGUgb3ZlcmxheSBjb250YWluZXIuXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVlvZmZzZXQoc2VsZWN0Rml0KTtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlWG9mZnNldChzZWxlY3RGaXQpO1xuXG4gICAgICAgICAgICBzdXBlci51cGRhdGVWaWV3UG9ydEZpdChzZWxlY3RGaXQpO1xuICAgICAgICAgICAgLy8gY29udGFpbmVyIGRvZXMgbm90IGZpdCBpbiB2aWV3UG9ydCBhbmQgaXMgb3V0IG9uIFRvcCBvciBCb3R0b21cbiAgICAgICAgICAgIGlmIChzZWxlY3RGaXQuZml0VmVydGljYWwuYmFjayA8IDAgfHwgc2VsZWN0Rml0LmZpdFZlcnRpY2FsLmZvcndhcmQgPCAwICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZml0SW5WaWV3cG9ydChjb250ZW50RWxlbWVudCwgc2VsZWN0Rml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0LnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSBzZWxlY3RGaXQuc2Nyb2xsQW1vdW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3R5bGVzKGNvbnRlbnRFbGVtZW50LCBzZWxlY3RGaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBzZWxlY3RlZCBpdGVtIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVNjcm9sbEFtb3VudChzZWxlY3RGaXQ6IFNlbGVjdEZpdCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGl0ZW1FbGVtZW50UmVjdCA9IHNlbGVjdEZpdC5pdGVtUmVjdDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyID0gc2VsZWN0Rml0LnNjcm9sbENvbnRhaW5lcjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyUmVjdCA9IHNlbGVjdEZpdC5zY3JvbGxDb250YWluZXJSZWN0O1xuICAgICAgICBjb25zdCBzY3JvbGxEZWx0YSA9IHNjcm9sbENvbnRhaW5lclJlY3QudG9wIC0gaXRlbUVsZW1lbnRSZWN0LnRvcDtcbiAgICAgICAgbGV0IHNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCAtIHNjcm9sbERlbHRhO1xuXG4gICAgICAgIGNvbnN0IGRyb3BEb3duSGVpZ2h0ID0gc2Nyb2xsQ29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gLT0gZHJvcERvd25IZWlnaHQgLyAyO1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiArPSBpdGVtRWxlbWVudFJlY3QuaGVpZ2h0IC8gMjtcblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbihNYXRoLm1heCgwLCBzY3JvbGxQb3NpdGlvbiksIHNjcm9sbENvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBzY3JvbGxDb250YWluZXJSZWN0LmhlaWdodCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvc2l0aW9uIHRoZSBpdGVtcyBvdXRlciBjb250YWluZXIgc28gc2VsZWN0ZWQgaXRlbSB0ZXh0IGlzIHBvc2l0aW9uZWQgb3ZlciBpbnB1dCB0ZXh0IGFuZCBpZiBoZWFkZXJcbiAgICAgKiBBbmQvT1IgZm9vdGVyIC0gYm90aCBoZWFkZXIvZm9vdGVyIGFyZSB2aXNpYmxlXG4gICAgICogQHBhcmFtIHNlbGVjdEZpdCBzZWxlY3RGaXQgdG8gdXNlIGZvciBjb21wdXRhdGlvbi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZml0SW5WaWV3cG9ydChjb250ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIHNlbGVjdEZpdDogU2VsZWN0Rml0KSB7XG4gICAgICAgIGNvbnN0IGZvb3RlciA9IHNlbGVjdEZpdC5zY3JvbGxDb250YWluZXJSZWN0LmJvdHRvbSAtIHNlbGVjdEZpdC5jb250ZW50RWxlbWVudFJlY3QuYm90dG9tO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBzZWxlY3RGaXQuc2Nyb2xsQ29udGFpbmVyUmVjdC50b3AgLSBzZWxlY3RGaXQuY29udGVudEVsZW1lbnRSZWN0LnRvcDtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1GaXRTaXplID0gc2VsZWN0Rml0LnRhcmdldFJlY3QuYm90dG9tICsgc2VsZWN0Rml0LnN0eWxlcy5pdGVtVGV4dFRvSW5wdXRUZXh0RGlmZiAtIGZvb3RlcjtcbiAgICAgICAgY29uc3QgZmlyc3RJdGVtRml0U2l6ZSA9IHNlbGVjdEZpdC50YXJnZXRSZWN0LnRvcCAtIHNlbGVjdEZpdC5zdHlsZXMuaXRlbVRleHRUb0lucHV0VGV4dERpZmYgLSBoZWFkZXI7XG4gICAgICAgIC8vIG91dCBvZiB2aWV3UG9ydCBvbiBUb3BcbiAgICAgICAgaWYgKHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5iYWNrIDwgMCkge1xuICAgICAgICAgICAgY29uc3QgcG9zc2libGVTY3JvbGxBbW91bnQgPSBzZWxlY3RGaXQuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbEhlaWdodCAtXG4gICAgICAgICAgICAgICAgc2VsZWN0Rml0LnNjcm9sbENvbnRhaW5lclJlY3QuaGVpZ2h0IC0gc2VsZWN0Rml0LnNjcm9sbEFtb3VudDtcbiAgICAgICAgICAgIGlmIChwb3NzaWJsZVNjcm9sbEFtb3VudCArIHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5iYWNrID4gMCAmJiBmaXJzdEl0ZW1GaXRTaXplID4gc2VsZWN0Rml0LnZpZXdQb3J0UmVjdC50b3ApIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQuc2Nyb2xsQW1vdW50IC09IHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5iYWNrO1xuICAgICAgICAgICAgICAgIHNlbGVjdEZpdC52ZXJ0aWNhbE9mZnNldCAtPSBzZWxlY3RGaXQuZml0VmVydGljYWwuYmFjaztcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQudmVydGljYWxPZmZzZXQgPSAwIDtcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgLy8gb3V0IG9mIHZpZXdQb3J0IG9uIEJvdHRvbVxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5mb3J3YXJkIDwgMCkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdEZpdC5zY3JvbGxBbW91bnQgKyBzZWxlY3RGaXQuZml0VmVydGljYWwuZm9yd2FyZCA+IDAgJiYgbGFzdEl0ZW1GaXRTaXplIDwgc2VsZWN0Rml0LnZpZXdQb3J0UmVjdC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQuc2Nyb2xsQW1vdW50ICs9IHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5mb3J3YXJkO1xuICAgICAgICAgICAgICAgIHNlbGVjdEZpdC52ZXJ0aWNhbE9mZnNldCArPSBzZWxlY3RGaXQuZml0VmVydGljYWwuZm9yd2FyZDtcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQudmVydGljYWxPZmZzZXQgPSAtc2VsZWN0Rml0LmNvbnRlbnRFbGVtZW50UmVjdC5oZWlnaHQgKyBzZWxlY3RGaXQudGFyZ2V0UmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxfeU9mZnNldCA9IHNlbGVjdEZpdC52ZXJ0aWNhbE9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgZWxlbWVudCdzIHN0eWxlIHdoaWNoIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gc2VsZWN0Rml0IHNlbGVjdEZpdCB0byB1c2UgZm9yIGNvbXB1dGF0aW9uLlxuICAgICAqIEBwYXJhbSBpbml0aWFsQ2FsbCBzaG91bGQgYmUgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBpbml0aWFsIGNhbGwgdG8gdGhlIHBvc2l0aW9uIG1ldGhvZCBjYWxsaW5nIHNldFN0eWxlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZXRTdHlsZXMoY29udGVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3RGaXQ6IFNlbGVjdEZpdCkge1xuICAgICAgICBzdXBlci5zZXRTdHlsZShjb250ZW50RWxlbWVudCwgc2VsZWN0Rml0LnRhcmdldFJlY3QsIHNlbGVjdEZpdC5jb250ZW50RWxlbWVudFJlY3QsIHNlbGVjdEZpdCk7XG4gICAgICAgIGNvbnRlbnRFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7c2VsZWN0Rml0LnN0eWxlcy5jb250ZW50RWxlbWVudE5ld1dpZHRofXB4YDsgLy8gbWFuYWdlIGNvbnRhaW5lciBiYXNlZCBvbiBwYWRkaW5ncz9cbiAgICAgICAgdGhpcy5nbG9iYWxfc3R5bGVzLmNvbnRlbnRFbGVtZW50TmV3V2lkdGggPSBzZWxlY3RGaXQuc3R5bGVzLmNvbnRlbnRFbGVtZW50TmV3V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBuZWNlc3NhcnkgaW5wdXQgYW5kIHNlbGVjdGVkIGl0ZW0gc3R5bGVzIHRvIGJlIHVzZWQgZm9yIHBvc2l0aW9uaW5nIGl0ZW0gdGV4dCBvdmVyIGlucHV0IHRleHQuXG4gICAgICogQ2FsY3VsYXRlICYgU2V0IGRlZmF1bHQgaXRlbXMgY29udGFpbmVyIHdpZHRoLlxuICAgICAqIEBwYXJhbSBzZWxlY3RGaXQgc2VsZWN0Rml0IHRvIHVzZSBmb3IgY29tcHV0YXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTdHlsZXMoc2VsZWN0Rml0OiBTZWxlY3RGaXQpOiBTZWxlY3RTdHlsZXMgIHtcbiAgICAgICAgY29uc3Qgc3R5bGVzOiBTZWxlY3RTdHlsZXMgPSB7fTtcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5zZXR0aW5ncy50YXJnZXQgYXMgRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGl0ZW1FbGVtZW50U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZWN0Rml0Lml0ZW1FbGVtZW50KTtcbiAgICAgICAgY29uc3QgbnVtZXJpY0lucHV0Rm9udFNpemUgPSBwYXJzZUZsb2F0KGlucHV0RWxlbWVudFN0eWxlcy5mb250U2l6ZSk7XG4gICAgICAgIGNvbnN0IG51bWVyaWNJdGVtRm9udFNpemUgPSBwYXJzZUZsb2F0KGl0ZW1FbGVtZW50U3R5bGVzLmZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgaW5wdXRUZXh0VG9JbnB1dFRvcCA9IChzZWxlY3RGaXQudGFyZ2V0UmVjdC5ib3R0b20gLSBzZWxlY3RGaXQudGFyZ2V0UmVjdC50b3AgLSBudW1lcmljSW5wdXRGb250U2l6ZSkgLyAyO1xuICAgICAgICBjb25zdCBpdGVtVGV4dFRvSXRlbVRvcCA9IChzZWxlY3RGaXQuaXRlbVJlY3QuaGVpZ2h0IC0gbnVtZXJpY0l0ZW1Gb250U2l6ZSkgLyAyO1xuICAgICAgICAgLy8gQWRqdXN0IGZvciBpbnB1dCB0b3AgcGFkZGluZ1xuICAgICAgICBjb25zdCBuZWdhdGVJbnB1dFBhZGRpbmdzID0gKFxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoaW5wdXRFbGVtZW50U3R5bGVzLnBhZGRpbmdUb3ApIC1cbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KGlucHV0RWxlbWVudFN0eWxlcy5wYWRkaW5nQm90dG9tKVxuICAgICAgICAgICAgKSAvIDI7XG4gICAgICAgIHN0eWxlcy5pdGVtVGV4dFRvSW5wdXRUZXh0RGlmZiA9IE1hdGgucm91bmQoaXRlbVRleHRUb0l0ZW1Ub3AgLSBpbnB1dFRleHRUb0lucHV0VG9wICsgbmVnYXRlSW5wdXRQYWRkaW5ncyk7XG5cbiAgICAgICAgY29uc3QgbnVtZXJpY0xlZnRQYWRkaW5nID0gcGFyc2VGbG9hdChpdGVtRWxlbWVudFN0eWxlcy5wYWRkaW5nTGVmdCk7XG4gICAgICAgIGNvbnN0IG51bWVyaWNUZXh0SW5kZW50ID0gcGFyc2VGbG9hdChpdGVtRWxlbWVudFN0eWxlcy50ZXh0SW5kZW50KTtcblxuICAgICAgICBzdHlsZXMuaXRlbVRleHRQYWRkaW5nID0gbnVtZXJpY0xlZnRQYWRkaW5nO1xuICAgICAgICBzdHlsZXMuaXRlbVRleHRJbmRlbnQgPSBudW1lcmljVGV4dEluZGVudDtcbiAgICAgICAgLy8gMjQgaXMgdGhlIGlucHV0J3MgdG9nZ2xlIGRkbCBpY29uIHdpZHRoXG4gICAgICAgIHN0eWxlcy5jb250ZW50RWxlbWVudE5ld1dpZHRoID0gc2VsZWN0Rml0LnRhcmdldFJlY3Qud2lkdGggKyAyNCArIG51bWVyaWNMZWZ0UGFkZGluZyAqIDI7XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnRhaW4gdGhlIHNlbGVjdGVkIGl0ZW0gaWYgdGhlcmUgaXMgc3VjaCBvbmUgb3Igb3RoZXJ3aXNlIHVzZSB0aGUgZmlyc3Qgb25lXG4gICAgICovXG4gICAgcHVibGljIGdldEludGVyYWN0aW9uSXRlbUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBsZXQgaXRlbUVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdC5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1FbGVtZW50ID0gdGhpcy5zZWxlY3Quc2VsZWN0ZWRJdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIC8vIEQuUC4gRmViIDIyIDIwMTksICMzOTIxIEZvcmNlIGl0ZW0gc2Nyb2xsIGJlZm9yZSBtZWFzdXJpbmcgaW4gSUUxMSwgZHVlIHRvIGJhc2Ugc2Nyb2xsVG9JdGVtIGRlbGF5XG4gICAgICAgICAgICBpZiAoaXNJRSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Quc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHRoaXMuc2VsZWN0LmNhbGN1bGF0ZVNjcm9sbFBvc2l0aW9uKHRoaXMuc2VsZWN0LnNlbGVjdGVkSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtRWxlbWVudCA9IHRoaXMuc2VsZWN0LmdldEZpcnN0SXRlbUVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGhvdyBtdWNoIHRvIG9mZnNldCB0aGUgb3ZlcmxheSBjb250YWluZXIgZm9yIFktYXhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVlvZmZzZXQoc2VsZWN0Rml0OiBTZWxlY3RGaXQpIHtcbiAgICAgICAgc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0ID0gLShzZWxlY3RGaXQuaXRlbVJlY3QudG9wIC0gc2VsZWN0Rml0LmNvbnRlbnRFbGVtZW50UmVjdC50b3AgK1xuICAgICAgICAgICAgc2VsZWN0Rml0LnN0eWxlcy5pdGVtVGV4dFRvSW5wdXRUZXh0RGlmZiAtIHNlbGVjdEZpdC5zY3JvbGxBbW91bnQpO1xuICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBob3cgbXVjaCB0byBvZmZzZXQgdGhlIG92ZXJsYXkgY29udGFpbmVyIGZvciBYLWF4aXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVYb2Zmc2V0KHNlbGVjdEZpdDogU2VsZWN0Rml0KSB7XG4gICAgICAgIHNlbGVjdEZpdC5ob3Jpem9udGFsT2Zmc2V0ID0gc2VsZWN0Rml0LnN0eWxlcy5pdGVtVGV4dEluZGVudCAtIHNlbGVjdEZpdC5zdHlsZXMuaXRlbVRleHRQYWRkaW5nO1xuICAgICAgICB0aGlzLmdsb2JhbF94T2Zmc2V0ID0gc2VsZWN0Rml0Lmhvcml6b250YWxPZmZzZXQ7XG4gICAgfVxufVxuXG4vKiogQGhpZGRlbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RGaXQgZXh0ZW5kcyBDb25uZWN0ZWRGaXQge1xuICAgIGl0ZW1FbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgc2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBzY3JvbGxDb250YWluZXJSZWN0OiBDbGllbnRSZWN0O1xuICAgIGl0ZW1SZWN0PzogQ2xpZW50UmVjdDtcbiAgICBzdHlsZXM/OiBTZWxlY3RTdHlsZXM7XG4gICAgc2Nyb2xsQW1vdW50PzogbnVtYmVyO1xufVxuXG4vKiogQGhpZGRlbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RTdHlsZXMge1xuICAgIGl0ZW1UZXh0UGFkZGluZz86IG51bWJlcjtcbiAgICBpdGVtVGV4dEluZGVudD86IG51bWJlcjtcbiAgICBpdGVtVGV4dFRvSW5wdXRUZXh0RGlmZj86IG51bWJlcjtcbiAgICBjb250ZW50RWxlbWVudE5ld1dpZHRoPzogbnVtYmVyO1xuICAgIG51bWVyaWNMZWZ0UGFkZGluZz86IG51bWJlcjtcbn1cbiJdfQ==