UNPKG

@fivethree/core

Version:
385 lines 34.8 kB
/** * @fileoverview added by tsickle * Generated from: lib/spinner/spinner.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { DomSanitizer } from '@angular/platform-browser'; import { AnimationBuilder, style, animate } from '@angular/animations'; import { takeUntil } from 'rxjs/operators'; import { Component, Input, Optional, Inject, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, ChangeDetectorRef, EventEmitter, Output, ViewChild, HostBinding } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { timer, interval } from 'rxjs'; /** @type {?} */ var BASE_SIZE = 100; var FivSpinner = /** @class */ (function () { function FivSpinner(_document, _elementRef, change, builder, sanitizer) { this._document = _document; this._elementRef = _elementRef; this.change = change; this.builder = builder; this.sanitizer = sanitizer; this._diameter = BASE_SIZE; this._strokeWidth = 10; this._value = 0; this.fivProgress = new EventEmitter(); this.fivComplete = new EventEmitter(); this.mode = 'indeterminate'; this.circleRadius = 45; this._color = 'var(--fiv-spin-color)'; } Object.defineProperty(FivSpinner.prototype, "class", { get: /** * @return {?} */ function () { return (this.mode + ' fiv-spinner fiv-progress-spinner fiv-progress-spinner-indeterminate-animation'); }, enumerable: true, configurable: true }); /** * @return {?} */ FivSpinner.prototype.ngOnInit = /** * @return {?} */ function () { }; Object.defineProperty(FivSpinner.prototype, "viewBox", { get: /** * @return {?} */ function () { /** @type {?} */ var viewBox = this.circleRadius * 2 + this.strokeWidth; return "0 0 " + viewBox + " " + viewBox; }, enumerable: true, configurable: true }); Object.defineProperty(FivSpinner.prototype, "strokeCircumference", { /** The stroke circumference of the svg circle. */ get: /** * The stroke circumference of the svg circle. * @return {?} */ function () { return 2 * Math.PI * this.circleRadius; }, enumerable: true, configurable: true }); Object.defineProperty(FivSpinner.prototype, "strokeDashOffset", { /** The dash offset of the svg circle. */ get: /** * The dash offset of the svg circle. * @return {?} */ function () { if (this.mode === 'determinate') { return (this.strokeCircumference * (100 - this._value)) / 100; } return null; }, enumerable: true, configurable: true }); Object.defineProperty(FivSpinner.prototype, "circleStrokeWidth", { /** Stroke width of the circle in percent. */ get: /** * Stroke width of the circle in percent. * @return {?} */ function () { return (this.strokeWidth / this.diameter) * 100; }, enumerable: true, configurable: true }); Object.defineProperty(FivSpinner.prototype, "value", { /** Value of the progress circle. */ get: /** * Value of the progress circle. * @return {?} */ function () { return this.mode === 'determinate' ? this._value : 0; }, set: /** * @param {?} newValue * @return {?} */ function (newValue) { this._value = Math.max(0, Math.min(100, newValue)); }, enumerable: true, configurable: true }); Object.defineProperty(FivSpinner.prototype, "diameter", { get: /** * @return {?} */ function () { return this._diameter; }, set: /** * @param {?} size * @return {?} */ function (size) { this._diameter = size; if (!FivSpinner.diameters.has(this._diameter)) { this._attachStyleNode(); } }, enumerable: true, configurable: true }); Object.defineProperty(FivSpinner.prototype, "strokeWidth", { /** Stroke width of the progress spinner. */ get: /** * Stroke width of the progress spinner. * @return {?} */ function () { return this._strokeWidth || this.diameter / 10; }, set: /** * @param {?} value * @return {?} */ function (value) { this._strokeWidth = value; }, enumerable: true, configurable: true }); /** Dynamically generates a style tag containing the correct animation for this diameter. */ /** * Dynamically generates a style tag containing the correct animation for this diameter. * @private * @return {?} */ FivSpinner.prototype._attachStyleNode = /** * Dynamically generates a style tag containing the correct animation for this diameter. * @private * @return {?} */ function () { /** @type {?} */ var styleTag = FivSpinner.styleTag; if (!styleTag) { styleTag = this._document.createElement('style'); this._document.head.appendChild(styleTag); FivSpinner.styleTag = styleTag; } if (styleTag && styleTag.sheet) { ((/** @type {?} */ (styleTag.sheet))).insertRule(this._getAnimationText(), 0); } FivSpinner.diameters.add(this.diameter); }; /** Generates animation styles adjusted for the spinner's diameter. */ /** * Generates animation styles adjusted for the spinner's diameter. * @private * @return {?} */ FivSpinner.prototype._getAnimationText = /** * Generates animation styles adjusted for the spinner's diameter. * @private * @return {?} */ function () { /** @type {?} */ var INDETERMINATE_ANIMATION_TEMPLATE = "\n @keyframes fiv-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n "; return (INDETERMINATE_ANIMATION_TEMPLATE // Animation should begin at 5% and end at 80% .replace(/START_VALUE/g, "" + 0.95 * this.strokeCircumference) .replace(/END_VALUE/g, "" + 0.2 * this.strokeCircumference) .replace(/DIAMETER/g, "" + this.diameter)); }; /** * @param {?} duration * @return {?} */ FivSpinner.prototype.completeIn = /** * @param {?} duration * @return {?} */ function (duration) { var _this = this; this.mode = 'determinate'; this.change.detectChanges(); /** @type {?} */ var animation = this.builder.build([ style({ 'stroke-dasharray': 180, 'stroke-dashoffset': 90, transformOrigin: 'center', stroke: 'var(--fiv-spin-color)' }), animate(duration + "ms ease-out", style({ 'stroke-dasharray': 315, 'stroke-dashoffset': 0, transformOrigin: 'center', stroke: 'var(--fiv-spin-color)', opacity: 0 })) ]); /** @type {?} */ var player = animation.create(this.determinateCircle.nativeElement); player.play(); player.onDone((/** * @return {?} */ function () { _this.fivComplete.emit(_this); _this._value = 0; })); /** @type {?} */ var i = interval(duration / 100); /** @type {?} */ var t = timer(duration + duration / 50); /** @type {?} */ var progress = i.pipe(takeUntil(t)); progress.subscribe((/** * @param {?} p * @return {?} */ function (p) { _this.fivProgress.emit(p); })); }; /** * @param {?} progress * @return {?} */ FivSpinner.prototype.setValue = /** * @param {?} progress * @return {?} */ function (progress) { this.mode = 'determinate'; this._value = progress; this.change.detectChanges(); }; /** * @return {?} */ FivSpinner.prototype.spin = /** * @return {?} */ function () { this.mode = 'indeterminate'; this.change.detectChanges(); }; /** * @return {?} */ FivSpinner.prototype.stop = /** * @return {?} */ function () { this._value = 0; this.change.detectChanges(); }; /** * @param {?} mode * @return {?} */ FivSpinner.prototype.setMode = /** * @param {?} mode * @return {?} */ function (mode) { this.mode = mode; this.change.detectChanges(); }; FivSpinner.diameters = new Set([BASE_SIZE]); FivSpinner.styleTag = null; FivSpinner.decorators = [ { type: Component, args: [{ selector: 'fiv-spinner', template: "<svg [style.width.px]=\"diameter\" [style.height.px]=\"diameter\" [attr.viewBox]=\"viewBox\"\n preserveAspectRatio=\"xMidYMid meet\" focusable=\"false\" [ngSwitch]=\"mode == 'indeterminate'\">\n <circle [attr.stroke]=\"_color\" *ngSwitchCase=\"true\" cx=\"50%\" cy=\"50%\" [attr.r]=\"circleRadius\"\n [style.animation-name]=\"'fiv-progress-spinner-stroke-rotate-' + diameter\"\n [style.stroke-dashoffset.px]=\"strokeDashOffset\" [style.stroke-dasharray.px]=\"strokeCircumference\"\n [style.stroke-width.%]=\"circleStrokeWidth\"></circle>\n\n <circle [attr.stroke]=\"_color\" class=\"determinate-circle\" #determinateCircle *ngSwitchCase=\"false\" cx=\"50%\" cy=\"50%\"\n [attr.r]=\"circleRadius\" [style.stroke-dashoffset.px]=\"strokeDashOffset\"\n [style.stroke-dasharray.px]=\"strokeCircumference\" [style.stroke-width.%]=\"circleStrokeWidth\"></circle>\n</svg>", // tslint:disable-next-line:use-host-property-decorator host: { '[style.width.px]': 'diameter', '[style.height.px]': 'diameter' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: ["fiv-spinner{display:block;position:relative}fiv-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}fiv-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}fiv-spinner.fiv-progress-spinner-indeterminate-animation.determinate circle{transition-property:stroke;-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}fiv-spinner.fiv-progress-spinner-indeterminate-animation.indeterminate{-webkit-animation:2s linear infinite fiv-progress-spinner-linear-rotate;animation:2s linear infinite fiv-progress-spinner-linear-rotate}fiv-spinner.fiv-progress-spinner-indeterminate-animation.indeterminate circle{transition-property:stroke;-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes fiv-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes fiv-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@-webkit-keyframes fiv-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.6061718819px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677646px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677646px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677646px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677646px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes fiv-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.6061718819px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677646px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677646px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677646px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677646px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(341.5deg)}}"] }] } ]; /** @nocollapse */ FivSpinner.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }, { type: ElementRef }, { type: ChangeDetectorRef }, { type: AnimationBuilder }, { type: DomSanitizer } ]; }; FivSpinner.propDecorators = { fivProgress: [{ type: Output }], fivComplete: [{ type: Output }], determinateCircle: [{ type: ViewChild, args: ['determinateCircle', { static: false },] }], mode: [{ type: Input }], circleRadius: [{ type: Input }], class: [{ type: HostBinding, args: ['class',] }], value: [{ type: Input }], diameter: [{ type: Input }], strokeWidth: [{ type: Input }] }; return FivSpinner; }()); export { FivSpinner }; if (false) { /** * @type {?} * @private */ FivSpinner.diameters; /** * @type {?} * @private */ FivSpinner.styleTag; /** * @type {?} * @private */ FivSpinner.prototype._diameter; /** @type {?} */ FivSpinner.prototype._strokeWidth; /** @type {?} */ FivSpinner.prototype._value; /** @type {?} */ FivSpinner.prototype.fivProgress; /** @type {?} */ FivSpinner.prototype.fivComplete; /** @type {?} */ FivSpinner.prototype.determinateCircle; /** @type {?} */ FivSpinner.prototype.mode; /** @type {?} */ FivSpinner.prototype.circleRadius; /** @type {?} */ FivSpinner.prototype._color; /** * @type {?} * @private */ FivSpinner.prototype._document; /** @type {?} */ FivSpinner.prototype._elementRef; /** @type {?} */ FivSpinner.prototype.change; /** * @type {?} * @private */ FivSpinner.prototype.builder; /** @type {?} */ FivSpinner.prototype.sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZml2ZXRocmVlL2NvcmUvIiwic291cmNlcyI6WyJsaWIvc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOztJQUNqQyxTQUFTLEdBQUcsR0FBRztBQUVyQjtJQWtDRSxvQkFDd0MsU0FBYyxFQUM3QyxXQUF1QixFQUN2QixNQUF5QixFQUN4QixPQUF5QixFQUMxQixTQUF1QjtRQUpRLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDeEIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXhCeEIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM5QixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFD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RVgsaUNBQW1EOztJQUNuRCxpQ0FBdUQ7O0lBQ3ZELHVDQUM4Qjs7SUFDOUIsMEJBQWlFOztJQUNqRSxrQ0FBMkI7O0lBQzNCLDRCQUFpQzs7Ozs7SUFVL0IsK0JBQW9EOztJQUNwRCxpQ0FBOEI7O0lBQzlCLDRCQUFnQzs7Ozs7SUFDaEMsNkJBQWlDOztJQUNqQywrQkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFuaW1hdGlvbkJ1aWxkZXIsIHN0eWxlLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBJbmplY3QsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEhvc3RCaW5kaW5nLFxuICBSZW5kZXJlcjJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0aW1lciwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmNvbnN0IEJBU0VfU0laRSA9IDEwMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZml2LXNwaW5uZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3Bpbm5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwaW5uZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVzZS1ob3N0LXByb3BlcnR5LWRlY29yYXRvclxuICBob3N0OiB7XG4gICAgJ1tzdHlsZS53aWR0aC5weF0nOiAnZGlhbWV0ZXInLFxuICAgICdbc3R5bGUuaGVpZ2h0LnB4XSc6ICdkaWFtZXRlcidcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRml2U3Bpbm5lciBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgc3RhdGljIGRpYW1ldGVycyA9IG5ldyBTZXQ8bnVtYmVyPihbQkFTRV9TSVpFXSk7XG4gIHByaXZhdGUgc3RhdGljIHN0eWxlVGFnOiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2RpYW1ldGVyID0gQkFTRV9TSVpFO1xuICBfc3Ryb2tlV2lkdGggPSAxMDtcbiAgX3ZhbHVlID0gMDtcblxuICBAT3V0cHV0KCkgZml2UHJvZ3Jlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGZpdkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxGaXZTcGlubmVyPigpO1xuICBAVmlld0NoaWxkKCdkZXRlcm1pbmF0ZUNpcmNsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBkZXRlcm1pbmF0ZUNpcmNsZTogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgbW9kZTogJ2luZGV0ZXJtaW5hdGUnIHwgJ2RldGVybWluYXRlJyA9ICdpbmRldGVybWluYXRlJztcbiAgQElucHV0KCkgY2lyY2xlUmFkaXVzID0gNDU7XG4gIF9jb2xvciA9ICd2YXIoLS1maXYtc3Bpbi1jb2xvciknO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBnZXQgY2xhc3MoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubW9kZSArXG4gICAgICAnIGZpdi1zcGlubmVyIGZpdi1wcm9ncmVzcy1zcGlubmVyIGZpdi1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uJ1xuICAgICk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55LFxuICAgIHB1YmxpYyBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwdWJsaWMgY2hhbmdlOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIsXG4gICAgcHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyXG4gICkge31cblxuICBuZ09uSW5pdCgpIHt9XG5cbiAgZ2V0IHZpZXdCb3goKSB7XG4gICAgY29uc3Qgdmlld0JveCA9IHRoaXMuY2lyY2xlUmFkaXVzICogMiArIHRoaXMuc3Ryb2tlV2lkdGg7XG4gICAgcmV0dXJuIGAwIDAgJHt2aWV3Qm94fSAke3ZpZXdCb3h9YDtcbiAgfVxuXG4gIC8qKiBUaGUgc3Ryb2tlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIHN2ZyBjaXJjbGUuICovXG4gIGdldCBzdHJva2VDaXJjdW1mZXJlbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDIgKiBNYXRoLlBJICogdGhpcy5jaXJjbGVSYWRpdXM7XG4gIH1cblxuICAvKiogVGhlIGRhc2ggb2Zmc2V0IG9mIHRoZSBzdmcgY2lyY2xlLiAqL1xuICBnZXQgc3Ryb2tlRGFzaE9mZnNldCgpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGV0ZXJtaW5hdGUnKSB7XG4gICAgICByZXR1cm4gKHRoaXMuc3Ryb2tlQ2lyY3VtZmVyZW5jZSAqICgxMDAgLSB0aGlzLl92YWx1ZSkpIC8gMTAwO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFN0cm9rZSB3aWR0aCBvZiB0aGUgY2lyY2xlIGluIHBlcmNlbnQuICovXG4gIGdldCBjaXJjbGVTdHJva2VXaWR0aCgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3Ryb2tlV2lkdGggLyB0aGlzLmRpYW1ldGVyKSAqIDEwMDtcbiAgfVxuXG4gIC8qKiBWYWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgY2lyY2xlLiAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZGV0ZXJtaW5hdGUnID8gdGhpcy5fdmFsdWUgOiAwO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG5ld1ZhbHVlKSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgZGlhbWV0ZXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGlhbWV0ZXI7XG4gIH1cbiAgc2V0IGRpYW1ldGVyKHNpemU6IG51bWJlcikge1xuICAgIHRoaXMuX2RpYW1ldGVyID0gc2l6ZTtcblxuICAgIGlmICghRml2U3Bpbm5lci5kaWFtZXRlcnMuaGFzKHRoaXMuX2RpYW1ldGVyKSkge1xuICAgICAgdGhpcy5fYXR0YWNoU3R5bGVOb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0cm9rZSB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3Mgc3Bpbm5lci4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHN0cm9rZVdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cm9rZVdpZHRoIHx8IHRoaXMuZGlhbWV0ZXIgLyAxMDtcbiAgfVxuICBzZXQgc3Ryb2tlV2lkdGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N0cm9rZVdpZHRoID0gdmFsdWU7XG4gIH1cblxuICAvKiogRHluYW1pY2FsbHkgZ2VuZXJhdGVzIGEgc3R5bGUgdGFnIGNvbnRhaW5pbmcgdGhlIGNvcnJlY3QgYW5pbWF0aW9uIGZvciB0aGlzIGRpYW1ldGVyLiAqL1xuICBwcml2YXRlIF9hdHRhY2hTdHlsZU5vZGUoKTogdm9pZCB7XG4gICAgbGV0IHN0eWxlVGFnID0gRml2U3Bpbm5lci5zdHlsZVRhZztcblxuICAgIGlmICghc3R5bGVUYWcpIHtcbiAgICAgIHN0eWxlVGFnID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgRml2U3Bpbm5lci5zdHlsZVRhZyA9IHN0eWxlVGFnO1xuICAgIH1cblxuICAgIGlmIChzdHlsZVRhZyAmJiBzdHlsZVRhZy5zaGVldCkge1xuICAgICAgKHN0eWxlVGFnLnNoZWV0IGFzIENTU1N0eWxlU2hlZXQpLmluc2VydFJ1bGUodGhpcy5fZ2V0QW5pbWF0aW9uVGV4dCgpLCAwKTtcbiAgICB9XG5cbiAgICBGaXZTcGlubmVyLmRpYW1ldGVycy5hZGQodGhpcy5kaWFtZXRlcik7XG4gIH1cblxuICAvKiogR2VuZXJhdGVzIGFuaW1hdGlvbiBzdHlsZXMgYWRqdXN0ZWQgZm9yIHRoZSBzcGlubmVyJ3MgZGlhbWV0ZXIuICovXG4gIHByaXZhdGUgX2dldEFuaW1hdGlvblRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBJTkRFVEVSTUlOQVRFX0FOSU1BVElPTl9URU1QTEFURSA9IGBcbiAgICBAa2V5ZnJhbWVzIGZpdi1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtRElBTUVURVIge1xuICAgICAgIDAlICAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgICAgIDEyLjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgICAgIDEyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKTsgfVxuICAgICAgIDI1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyk7IH1cbiAgICAgICAyNS4wMDAxJSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfVxuICAgICAgIDM3LjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4gICAgICAgMzcuNTAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKTsgfVxuICAgICAgIDUwJSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpOyB9XG4gICAgICAgNTAuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfVxuICAgICAgIDYyLjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOyB9XG4gICAgICAgNjIuNTAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKTsgfVxuICAgICAgIDc1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMjUxLjVkZWcpOyB9XG4gICAgICAgNzUuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOyB9XG4gICAgICAgODcuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsgfVxuICAgICAgIDg3LjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyk7IH1cbiAgICAgICAxMDAlICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDM0MS41ZGVnKTsgfVxuICAgICB9XG4gICBgO1xuICAgIHJldHVybiAoXG4gICAgICBJTkRFVEVSTUlOQVRFX0FOSU1BVElPTl9URU1QTEFURVxuICAgICAgICAvLyBBbmltYXRpb24gc2hvdWxkIGJlZ2luIGF0IDUlIGFuZCBlbmQgYXQgODAlXG4gICAgICAgIC5yZXBsYWNlKC9TVEFSVF9WQUxVRS9nLCBgJHswLjk1ICogdGhpcy5zdHJva2VDaXJjdW1mZXJlbmNlfWApXG4gICAgICAgIC5yZXBsYWNlKC9FTkRfVkFMVUUvZywgYCR7MC4yICogdGhpcy5zdHJva2VDaXJjdW1mZXJlbmNlfWApXG4gICAgICAgIC5yZXBsYWNlKC9ESUFNRVRFUi9nLCBgJHt0aGlzLmRpYW1ldGVyfWApXG4gICAgKTtcbiAgfVxuXG4gIGNvbXBsZXRlSW4oZHVyYXRpb246IG51bWJlcikge1xuICAgIHRoaXMubW9kZSA9ICdkZXRlcm1pbmF0ZSc7XG4gICAgdGhpcy5jaGFuZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy5idWlsZGVyLmJ1aWxkKFtcbiAgICAgIHN0eWxlKHtcbiAgICAgICAgJ3N0cm9rZS1kYXNoYXJyYXknOiAxODAsXG4gICAgICAgICdzdHJva2UtZGFzaG9mZnNldCc6IDkwLFxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICdjZW50ZXInLFxuICAgICAgICBzdHJva2U6ICd2YXIoLS1maXYtc3Bpbi1jb2xvciknXG4gICAgICB9KSxcbiAgICAgIGFuaW1hdGUoXG4gICAgICAgIGAke2R1cmF0aW9ufW1zIGVhc2Utb3V0YCxcbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICdzdHJva2UtZGFzaGFycmF5JzogMzE1LFxuICAgICAgICAgICdzdHJva2UtZGFzaG9mZnNldCc6IDAsXG4gICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnY2VudGVyJyxcbiAgICAgICAgICBzdHJva2U6ICd2YXIoLS1maXYtc3Bpbi1jb2xvciknLFxuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKTtcblxuICAgIGNvbnN0IHBsYXllciA9IGFuaW1hdGlvbi5jcmVhdGUodGhpcy5kZXRlcm1pbmF0ZUNpcmNsZS5uYXRpdmVFbGVtZW50KTtcbiAgICBwbGF5ZXIucGxheSgpO1xuICAgIHBsYXllci5vbkRvbmUoKCkgPT4ge1xuICAgICAgdGhpcy5maXZDb21wbGV0ZS5lbWl0KHRoaXMpO1xuICAgICAgdGhpcy5fdmFsdWUgPSAwO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaSA9IGludGVydmFsKGR1cmF0aW9uIC8gMTAwKTtcbiAgICBjb25zdCB0ID0gdGltZXIoZHVyYXRpb24gKyBkdXJhdGlvbiAvIDUwKTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGkucGlwZSh0YWtlVW50aWwodCkpO1xuXG4gICAgcHJvZ3Jlc3Muc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgdGhpcy5maXZQcm9ncmVzcy5lbWl0KHApO1xuICAgIH0pO1xuICB9XG4gIHNldFZhbHVlKHByb2dyZXNzOiBudW1iZXIpOiBhbnkge1xuICAgIHRoaXMubW9kZSA9ICdkZXRlcm1pbmF0ZSc7XG4gICAgdGhpcy5fdmFsdWUgPSBwcm9ncmVzcztcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzcGluKCkge1xuICAgIHRoaXMubW9kZSA9ICdpbmRldGVybWluYXRlJztcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMuX3ZhbHVlID0gMDtcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzZXRNb2RlKG1vZGUpIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxufVxuIl19