UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

158 lines • 24.6 kB
import { inject } from '@angular/core'; import { filter, tap } from 'rxjs'; import { GainsightService } from '../product-experience'; const PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD = { EVENTS: { INTERVAL_BASED_RELOAD: 'intervalBasedReload' }, COMPONENTS: { ALARM_WIDGET_ALARM_RELOAD: 'alarm-widget-alarms-reload', DATAPOINTS_RELOAD: 'datapoints-reload' }, ACTIONS: { MANUALLY_CHANGED_COUNTDOWN_STATE: 'manuallyChangedCountdownState' }, RESULT: { MANUALLY_PAUSED_COUNTDOWN: 'manuallyPausedCountdown', MANUALLY_RESUMED_COUNTDOWN: 'manuallyResumedCountdown' } }; export const WIDGET_TYPE_VALUES = { ALARMS: 'alarms', DATA_POINTS_TABLE: 'dataPointsTable' }; /** * Abstract class representing an interval reload functionality. * This class provides methods and properties for managing an interval-based reload mechanism. */ export class IntervalBasedReload { constructor() { this.gainsightService = inject(GainsightService); } /** * Stops the countdown and triggers a refresh action. * This function is responsible for halting the countdown interval component's operation. * After stopping the countdown, it emits an `onCountdownEnded` event. * This event is used to inform external components that the countdown has ended, * typically prompting them to reload or refresh their data. */ autoRefreshList() { if (this.isIntervalRefreshToggleOn && this.isAutoRefreshEnabled) { this.countdownIntervalComponent.stop(); } this.onCountdownEnded.emit(); } /** * Manages the countdown timer's visibility and state in response to user scrolling. * * This method toggles the countdown timer based on the user's scrolling behavior. It uses * the `disableCountdown` and `enableCountdown` methods for handling the countdown state. * * - If the user is scrolling down while the countdown is visible (`isScrolling` is true and * `hideCountdown` is false), `disableCountdown` is called to stop and hide the countdown, * and `isIntervalRefreshToggleOn` is set to false. * * - If the user has stopped scrolling, the countdown subscription is closed, and the countdown * is hidden (`!isScrolling`, `countdownSubscription?.closed`, `hideCountdown`), `enableCountdown` * is called to show and restart the countdown, and `isIntervalRefreshToggleOn` is set to true. */ handleScrolling() { // Checks if the user has scrolled down while the countdown is visible const onUserScrollDownHide = this.isScrolling && !this.hideCountdown; if (onUserScrollDownHide) { this.disableCountdown(); this.isIntervalRefreshToggleOn = false; return; } // Checks if the user has stopped scrolling and the countdown is currently hidden const onUserScrollTopShow = !this.isScrolling && this.countdownSubscription?.closed && this.hideCountdown; if (onUserScrollTopShow) { this.isIntervalRefreshToggleOn = true; this.enableCountdown(); } } /** * Handles the toggle state of the countdown on button click. * * This method is triggered by a mouse event, typically a click on the countdown toggle button. * It toggles `isIntervalRefreshToggleOn` to reflect the current state of the countdown timer. * * - If `isIntervalRefreshToggleOn` is set to false, indicating that the countdown should be stopped, * `disableCountdown` is called, and `manuallyDisabledCountdown` is set to true. * * - If `isIntervalRefreshToggleOn` is true and the countdown subscription is closed, indicating that * the countdown can be started, `enableCountdown` is called, and `manuallyDisabledCountdown` * is set to false. * * @param $event - The MouseEvent that triggered this method. * @param widgetType - The type of the widget that triggered the event */ onToggleCountdownButtonState($event, widgetType) { $event.preventDefault(); this.isIntervalRefreshToggleOn = !this.isRefreshDisabled && !this.isIntervalRefreshToggleOn; this.updateCountdownButtonTooltipText(); if (!this.isIntervalRefreshToggleOn) { this.disableCountdown(); this.manuallyDisabledCountdown = true; this.triggerGainsightEvent(widgetType, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.ACTIONS.MANUALLY_CHANGED_COUNTDOWN_STATE, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.RESULT.MANUALLY_PAUSED_COUNTDOWN); return; } const onRefreshToggleOn = this.isIntervalRefreshToggleOn && this.countdownSubscription.closed; if (onRefreshToggleOn) { this.enableCountdown(); this.manuallyDisabledCountdown = false; this.triggerGainsightEvent(widgetType, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.ACTIONS.MANUALLY_CHANGED_COUNTDOWN_STATE, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.RESULT.MANUALLY_RESUMED_COUNTDOWN); } } /** * This function listens for changes in the `isLoading` observable, filtering out any truthy values. * Once a falsy value is detected (indicating that loading has finished), it attempts to start the countdown. * * IMPORTANT: If the widget's configuration (refreshInterval, check template) is not set prior to executing countdownIntervalComponent?.start, * the countdown interval will not start! * * @param injector - The injector used to provide necessary dependencies * within the `runInInjectionContext`. */ startCountdown() { this.countdownSubscription = this.isLoading .pipe(filter(isLoading => !Boolean(isLoading)), tap(() => { this.countdownIntervalComponent?.start(); })) .subscribe(); } /** * Disables and hides the countdown timer. * * This method stops the ongoing countdown process by * stopping the `countdownIntervalComponent` if it exists. It then hides the countdown timer * by setting `hideCountdown` to true. This method encapsulates the logic required to halt and * conceal the countdown timer. */ disableCountdown() { this.countdownSubscription.unsubscribe(); this.countdownIntervalComponent?.stop(); this.hideCountdown = true; } triggerGainsightEvent(widgetType, action, result) { if (widgetType) { this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.EVENTS.INTERVAL_BASED_RELOAD, { action, result, component: this.determineComponentName(widgetType), widget: widgetType }); } } determineComponentName(widgetType) { switch (widgetType) { case WIDGET_TYPE_VALUES.ALARMS: return PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.COMPONENTS.ALARM_WIDGET_ALARM_RELOAD; case WIDGET_TYPE_VALUES.DATA_POINTS_TABLE: return PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.COMPONENTS.DATAPOINTS_RELOAD; default: return ''; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwtYmFzZWQtcmVsb2FkLmFic3RyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9jb21tb24vaW50ZXJ2YWwtYmFzZWQtcmVsb2FkLmFic3RyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBbUIsTUFBTSxFQUFnQixHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsTUFBTSx3Q0FBd0MsR0FBRztJQUMvQyxNQUFNLEVBQUU7UUFDTixxQkFBcUIsRUFBRSxxQkFBcUI7S0FDN0M7SUFDRCxVQUFVLEVBQUU7UUFDVix5QkFBeUIsRUFBRSw0QkFBNEI7UUFDdkQsaUJBQWlCLEVBQUUsbUJBQW1CO0tBQ3ZDO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsZ0NBQWdDLEVBQUUsK0JBQStCO0tBQ2xFO0lBQ0QsTUFBTSxFQUFFO1FBQ04seUJBQXlCLEVBQUUseUJBQXlCO1FBQ3BELDBCQUEwQixFQUFFLDBCQUEwQjtLQUN2RDtDQUNPLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDNUIsQ0FBQztBQUlYOzs7R0FHRztBQUNILE1BQU0sT0FBZ0IsbUJBQW1CO0lBQXpDO1FBQ1kscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUE4TnhELENBQUM7SUEvS0M7Ozs7OztPQU1HO0lBQ0gsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQ0Qs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aEMsd0NBQXdDLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUNyRTtnQkFDRSxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sU0FBUyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ2xELE1BQU0sRUFBRSxVQUFVO2FBQ25CLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsVUFBc0I7UUFDbkQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNuQixLQUFLLGtCQUFrQixDQUFDLE1BQU07Z0JBQzVCLE9BQU8sd0NBQXdDLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDO1lBQ3ZGLEtBQUssa0JBQWtCLENBQUMsaUJBQWlCO2dCQUN2QyxPQUFPLHdDQUF3QyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztZQUMvRTtnQkFDRSxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaWx0ZXIsIFN1YnNjcmlwdGlvbiwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCB9IGZyb20gJy4uL2NvdW50ZG93bi1pbnRlcnZhbCc7XG5pbXBvcnQgeyBHYWluc2lnaHRTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC1leHBlcmllbmNlJztcblxuY29uc3QgUFJPRFVDVF9FWFBFUklFTkNFX0lOVEVSVkFMX0JBU0VEX1JFTE9BRCA9IHtcbiAgRVZFTlRTOiB7XG4gICAgSU5URVJWQUxfQkFTRURfUkVMT0FEOiAnaW50ZXJ2YWxCYXNlZFJlbG9hZCdcbiAgfSxcbiAgQ09NUE9ORU5UUzoge1xuICAgIEFMQVJNX1dJREdFVF9BTEFSTV9SRUxPQUQ6ICdhbGFybS13aWRnZXQtYWxhcm1zLXJlbG9hZCcsXG4gICAgREFUQVBPSU5UU19SRUxPQUQ6ICdkYXRhcG9pbnRzLXJlbG9hZCdcbiAgfSxcbiAgQUNUSU9OUzoge1xuICAgIE1BTlVBTExZX0NIQU5HRURfQ09VTlRET1dOX1NUQVRFOiAnbWFudWFsbHlDaGFuZ2VkQ291bnRkb3duU3RhdGUnXG4gIH0sXG4gIFJFU1VMVDoge1xuICAgIE1BTlVBTExZX1BBVVNFRF9DT1VOVERPV046ICdtYW51YWxseVBhdXNlZENvdW50ZG93bicsXG4gICAgTUFOVUFMTFlfUkVTVU1FRF9DT1VOVERPV046ICdtYW51YWxseVJlc3VtZWRDb3VudGRvd24nXG4gIH1cbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBXSURHRVRfVFlQRV9WQUxVRVMgPSB7XG4gIEFMQVJNUzogJ2FsYXJtcycsXG4gIERBVEFfUE9JTlRTX1RBQkxFOiAnZGF0YVBvaW50c1RhYmxlJ1xufSBhcyBjb25zdDtcblxudHlwZSBXaWRnZXRUeXBlID0gKHR5cGVvZiBXSURHRVRfVFlQRV9WQUxVRVMpW2tleW9mIHR5cGVvZiBXSURHRVRfVFlQRV9WQUxVRVNdO1xuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhbiBpbnRlcnZhbCByZWxvYWQgZnVuY3Rpb25hbGl0eS5cbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBmb3IgbWFuYWdpbmcgYW4gaW50ZXJ2YWwtYmFzZWQgcmVsb2FkIG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVydmFsQmFzZWRSZWxvYWQge1xuICBwcm90ZWN0ZWQgZ2FpbnNpZ2h0U2VydmljZSA9IGluamVjdChHYWluc2lnaHRTZXJ2aWNlKTtcblxuICBhYnN0cmFjdCBjb3VudGRvd25JbnRlcnZhbENvbXBvbmVudDogQ291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBIb2xkcyB0aGUgc3Vic2NyaXB0aW9uIHRvIGEgY291bnRkb3duIG9ic2VydmFibGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgY291bnRkb3duU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhdXRvLXJlZnJlc2ggaXMgZW5hYmxlZCBmb3IgdGhlIGRhdGFwb2ludHMgcmVsb2FkIGNvbXBvbmVudCB0aGF0IGlzIHNldCBpbiB3aWRnZXQgY29uZmlnLlxuICAgKi9cbiAgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciByZWZyZXNoaW5nIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKiBJdCdzICd0cnVlJyB3aGVuIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gdmlldyBhIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgaXNSZWZyZXNoRGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXJyZW50IGlzTG9hZGluZyBzdGF0ZS4gQmFzZWQgb24gaXQgbmV4dCBjb3VudGRvd24gY3ljbGUgaXMgYmVpbmcgc3RhcnRlZC5cbiAgICovXG4gIGFic3RyYWN0IGlzTG9hZGluZzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFsYXJtIGxpc3QgaXMgYmVpbmcgc2Nyb2xsZWQgb3Igbm90LlxuICAgKi9cbiAgYWJzdHJhY3QgaXNTY3JvbGxpbmc6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXJyZW50IHJlZnJlc2ggaW50ZXJ2YWwgc2V0IGluIGEgd2lkZ2V0IGNvbmZpZy5cbiAgICovXG4gIGFic3RyYWN0IHJlZnJlc2hJbnRlcnZhbDogbnVtYmVyO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgYSBjb3VudGRvd24gY3ljbGUgaGFzIGVuZGVkLlxuICAgKi9cbiAgYWJzdHJhY3Qgb25Db3VudGRvd25FbmRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGludGVydmFsIHJlZnJlc2ggdG9nZ2xlIGJ1dHRvbi5cbiAgICovXG4gIGFic3RyYWN0IGlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT246IGJvb2xlYW47XG5cbiAgYWJzdHJhY3QgdG9nZ2xlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3VudGRvd24gaGFzIGJlZW4gbWFudWFsbHkgZGlzYWJsZWQgYnkgdGhlIHVzZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbWFudWFsbHlEaXNhYmxlZENvdW50ZG93bjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb3VudGRvd24gdGltZXIgY29tcG9uZW50IGluIHRoZSBjdXJyZW50IGNvbXBvbmVudCdzIFVJLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGhpZGVDb3VudGRvd246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBjb3VudGRvd24gYW5kIHRyaWdnZXJzIGEgcmVmcmVzaCBhY3Rpb24uXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGhhbHRpbmcgdGhlIGNvdW50ZG93biBpbnRlcnZhbCBjb21wb25lbnQncyBvcGVyYXRpb24uXG4gICAqIEFmdGVyIHN0b3BwaW5nIHRoZSBjb3VudGRvd24sIGl0IGVtaXRzIGFuIGBvbkNvdW50ZG93bkVuZGVkYCBldmVudC5cbiAgICogVGhpcyBldmVudCBpcyB1c2VkIHRvIGluZm9ybSBleHRlcm5hbCBjb21wb25lbnRzIHRoYXQgdGhlIGNvdW50ZG93biBoYXMgZW5kZWQsXG4gICAqIHR5cGljYWxseSBwcm9tcHRpbmcgdGhlbSB0byByZWxvYWQgb3IgcmVmcmVzaCB0aGVpciBkYXRhLlxuICAgKi9cbiAgYXV0b1JlZnJlc2hMaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT24gJiYgdGhpcy5pc0F1dG9SZWZyZXNoRW5hYmxlZCkge1xuICAgICAgdGhpcy5jb3VudGRvd25JbnRlcnZhbENvbXBvbmVudC5zdG9wKCk7XG4gICAgfVxuICAgIHRoaXMub25Db3VudGRvd25FbmRlZC5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlcyB0aGUgY291bnRkb3duIHRpbWVyJ3MgdmlzaWJpbGl0eSBhbmQgc3RhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBzY3JvbGxpbmcuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHRvZ2dsZXMgdGhlIGNvdW50ZG93biB0aW1lciBiYXNlZCBvbiB0aGUgdXNlcidzIHNjcm9sbGluZyBiZWhhdmlvci4gSXQgdXNlc1xuICAgKiB0aGUgYGRpc2FibGVDb3VudGRvd25gIGFuZCBgZW5hYmxlQ291bnRkb3duYCBtZXRob2RzIGZvciBoYW5kbGluZyB0aGUgY291bnRkb3duIHN0YXRlLlxuICAgKlxuICAgKiAtIElmIHRoZSB1c2VyIGlzIHNjcm9sbGluZyBkb3duIHdoaWxlIHRoZSBjb3VudGRvd24gaXMgdmlzaWJsZSAoYGlzU2Nyb2xsaW5nYCBpcyB0cnVlIGFuZFxuICAgKiAgIGBoaWRlQ291bnRkb3duYCBpcyBmYWxzZSksIGBkaXNhYmxlQ291bnRkb3duYCBpcyBjYWxsZWQgdG8gc3RvcCBhbmQgaGlkZSB0aGUgY291bnRkb3duLFxuICAgKiAgIGFuZCBgaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbmAgaXMgc2V0IHRvIGZhbHNlLlxuICAgKlxuICAgKiAtIElmIHRoZSB1c2VyIGhhcyBzdG9wcGVkIHNjcm9sbGluZywgdGhlIGNvdW50ZG93biBzdWJzY3JpcHRpb24gaXMgY2xvc2VkLCBhbmQgdGhlIGNvdW50ZG93blxuICAgKiAgIGlzIGhpZGRlbiAoYCFpc1Njcm9sbGluZ2AsIGBjb3VudGRvd25TdWJzY3JpcHRpb24/LmNsb3NlZGAsIGBoaWRlQ291bnRkb3duYCksIGBlbmFibGVDb3VudGRvd25gXG4gICAqICAgaXMgY2FsbGVkIHRvIHNob3cgYW5kIHJlc3RhcnQgdGhlIGNvdW50ZG93biwgYW5kIGBpc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uYCBpcyBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIGhhbmRsZVNjcm9sbGluZygpOiB2b2lkIHtcbiAgICAvLyBDaGVja3MgaWYgdGhlIHVzZXIgaGFzIHNjcm9sbGVkIGRvd24gd2hpbGUgdGhlIGNvdW50ZG93biBpcyB2aXNpYmxlXG4gICAgY29uc3Qgb25Vc2VyU2Nyb2xsRG93bkhpZGUgPSB0aGlzLmlzU2Nyb2xsaW5nICYmICF0aGlzLmhpZGVDb3VudGRvd247XG5cbiAgICBpZiAob25Vc2VyU2Nyb2xsRG93bkhpZGUpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUNvdW50ZG93bigpO1xuICAgICAgdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIGlmIHRoZSB1c2VyIGhhcyBzdG9wcGVkIHNjcm9sbGluZyBhbmQgdGhlIGNvdW50ZG93biBpcyBjdXJyZW50bHkgaGlkZGVuXG4gICAgY29uc3Qgb25Vc2VyU2Nyb2xsVG9wU2hvdyA9XG4gICAgICAhdGhpcy5pc1Njcm9sbGluZyAmJiB0aGlzLmNvdW50ZG93blN1YnNjcmlwdGlvbj8uY2xvc2VkICYmIHRoaXMuaGlkZUNvdW50ZG93bjtcblxuICAgIGlmIChvblVzZXJTY3JvbGxUb3BTaG93KSB7XG4gICAgICB0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT24gPSB0cnVlO1xuICAgICAgdGhpcy5lbmFibGVDb3VudGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCByZWxvYWQoKTogdm9pZDtcbiAgLyoqXG4gICAqIFdyYXBwZXIgbWV0aG9kIHdoZXJlIGl0J3MgbmFtZSBiZXR0ZXIgZGVzY3JpYmVzIGEgY29udGV4dCB3aGVyZSBpdCB3YXMgY2FsbGVkLlxuICAgKi9cbiAgYWJzdHJhY3QgY291bnRkb3duRW5kZWQoKTogdm9pZDtcblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgdG9nZ2xlIHN0YXRlIG9mIHRoZSBjb3VudGRvd24gb24gYnV0dG9uIGNsaWNrLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgYSBtb3VzZSBldmVudCwgdHlwaWNhbGx5IGEgY2xpY2sgb24gdGhlIGNvdW50ZG93biB0b2dnbGUgYnV0dG9uLlxuICAgKiBJdCB0b2dnbGVzIGBpc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uYCB0byByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb3VudGRvd24gdGltZXIuXG4gICAqXG4gICAqIC0gSWYgYGlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25gIGlzIHNldCB0byBmYWxzZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBjb3VudGRvd24gc2hvdWxkIGJlIHN0b3BwZWQsXG4gICAqICAgYGRpc2FibGVDb3VudGRvd25gIGlzIGNhbGxlZCwgYW5kIGBtYW51YWxseURpc2FibGVkQ291bnRkb3duYCBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogLSBJZiBgaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbmAgaXMgdHJ1ZSBhbmQgdGhlIGNvdW50ZG93biBzdWJzY3JpcHRpb24gaXMgY2xvc2VkLCBpbmRpY2F0aW5nIHRoYXRcbiAgICogICB0aGUgY291bnRkb3duIGNhbiBiZSBzdGFydGVkLCBgZW5hYmxlQ291bnRkb3duYCBpcyBjYWxsZWQsIGFuZCBgbWFudWFsbHlEaXNhYmxlZENvdW50ZG93bmBcbiAgICogICBpcyBzZXQgdG8gZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSAkZXZlbnQgLSBUaGUgTW91c2VFdmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIG1ldGhvZC5cbiAgICogQHBhcmFtIHdpZGdldFR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgd2lkZ2V0IHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudFxuICAgKi9cbiAgb25Ub2dnbGVDb3VudGRvd25CdXR0b25TdGF0ZSgkZXZlbnQ6IE1vdXNlRXZlbnQsIHdpZGdldFR5cGU6IFdpZGdldFR5cGUpOiB2b2lkIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT24gPSAhdGhpcy5pc1JlZnJlc2hEaXNhYmxlZCAmJiAhdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uO1xuICAgIHRoaXMudXBkYXRlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHQoKTtcblxuICAgIGlmICghdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uKSB7XG4gICAgICB0aGlzLmRpc2FibGVDb3VudGRvd24oKTtcbiAgICAgIHRoaXMubWFudWFsbHlEaXNhYmxlZENvdW50ZG93biA9IHRydWU7XG5cbiAgICAgIHRoaXMudHJpZ2dlckdhaW5zaWdodEV2ZW50KFxuICAgICAgICB3aWRnZXRUeXBlLFxuICAgICAgICBQUk9EVUNUX0VYUEVSSUVOQ0VfSU5URVJWQUxfQkFTRURfUkVMT0FELkFDVElPTlMuTUFOVUFMTFlfQ0hBTkdFRF9DT1VOVERPV05fU1RBVEUsXG4gICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9JTlRFUlZBTF9CQVNFRF9SRUxPQUQuUkVTVUxULk1BTlVBTExZX1BBVVNFRF9DT1VOVERPV05cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb25SZWZyZXNoVG9nZ2xlT24gPSB0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT24gJiYgdGhpcy5jb3VudGRvd25TdWJzY3JpcHRpb24uY2xvc2VkO1xuXG4gICAgaWYgKG9uUmVmcmVzaFRvZ2dsZU9uKSB7XG4gICAgICB0aGlzLmVuYWJsZUNvdW50ZG93bigpO1xuICAgICAgdGhpcy5tYW51YWxseURpc2FibGVkQ291bnRkb3duID0gZmFsc2U7XG5cbiAgICAgIHRoaXMudHJpZ2dlckdhaW5zaWdodEV2ZW50KFxuICAgICAgICB3aWRnZXRUeXBlLFxuICAgICAgICBQUk9EVUNUX0VYUEVSSUVOQ0VfSU5URVJWQUxfQkFTRURfUkVMT0FELkFDVElPTlMuTUFOVUFMTFlfQ0hBTkdFRF9DT1VOVERPV05fU1RBVEUsXG4gICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9JTlRFUlZBTF9CQVNFRF9SRUxPQUQuUkVTVUxULk1BTlVBTExZX1JFU1VNRURfQ09VTlRET1dOXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGxpc3RlbnMgZm9yIGNoYW5nZXMgaW4gdGhlIGBpc0xvYWRpbmdgIG9ic2VydmFibGUsIGZpbHRlcmluZyBvdXQgYW55IHRydXRoeSB2YWx1ZXMuXG4gICAqIE9uY2UgYSBmYWxzeSB2YWx1ZSBpcyBkZXRlY3RlZCAoaW5kaWNhdGluZyB0aGF0IGxvYWRpbmcgaGFzIGZpbmlzaGVkKSwgaXQgYXR0ZW1wdHMgdG8gc3RhcnQgdGhlIGNvdW50ZG93bi5cbiAgICpcbiAgICogSU1QT1JUQU5UOiBJZiB0aGUgd2lkZ2V0J3MgY29uZmlndXJhdGlvbiAocmVmcmVzaEludGVydmFsLCBjaGVjayB0ZW1wbGF0ZSkgaXMgbm90IHNldCBwcmlvciB0byBleGVjdXRpbmcgY291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQ/LnN0YXJ0LFxuICAgKiB0aGUgY291bnRkb3duIGludGVydmFsIHdpbGwgbm90IHN0YXJ0IVxuICAgKlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBUaGUgaW5qZWN0b3IgdXNlZCB0byBwcm92aWRlIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXNcbiAgICogICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSBgcnVuSW5JbmplY3Rpb25Db250ZXh0YC5cbiAgICovXG4gIHN0YXJ0Q291bnRkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuY291bnRkb3duU3Vic2NyaXB0aW9uID0gdGhpcy5pc0xvYWRpbmdcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoaXNMb2FkaW5nID0+ICFCb29sZWFuKGlzTG9hZGluZykpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQ/LnN0YXJ0KCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBhbmQgc3RhcnRzIHRoZSBjb3VudGRvd24gdGltZXIuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG1ha2VzIHRoZSBjb3VudGRvd24gdmlzaWJsZSAoYGhpZGVDb3VudGRvd25gIGlzIHNldCB0byBmYWxzZSkgYW5kIHRoZW5cbiAgICogc3RhcnRzIHRoZSBjb3VudGRvd24gcHJvY2Vzcy4gSXQgZW5zdXJlcyB0aGUgY291bnRkb3duIHRpbWVyIGlzIHVwZGF0ZWQgaW1tZWRpYXRlbHlcbiAgICogYnkgdHJpZ2dlcmluZyBjaGFuZ2UgZGV0ZWN0aW9uIHdpdGggYGNkUmVmLmRldGVjdENoYW5nZXMoKWAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb3VudGRvd24uXG4gICAqIFRoaXMgbWV0aG9kIGVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgcmVxdWlyZWQgdG8gaW5pdGlhdGUgdGhlIGNvdW50ZG93biB0aW1lci5cbiAgICovXG4gIGFic3RyYWN0IGVuYWJsZUNvdW50ZG93bigpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBhbmQgaGlkZXMgdGhlIGNvdW50ZG93biB0aW1lci5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc3RvcHMgdGhlIG9uZ29pbmcgY291bnRkb3duIHByb2Nlc3MgYnlcbiAgICogc3RvcHBpbmcgdGhlIGBjb3VudGRvd25JbnRlcnZhbENvbXBvbmVudGAgaWYgaXQgZXhpc3RzLiBJdCB0aGVuIGhpZGVzIHRoZSBjb3VudGRvd24gdGltZXJcbiAgICogYnkgc2V0dGluZyBgaGlkZUNvdW50ZG93bmAgdG8gdHJ1ZS4gVGhpcyBtZXRob2QgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyByZXF1aXJlZCB0byBoYWx0IGFuZFxuICAgKiBjb25jZWFsIHRoZSBjb3VudGRvd24gdGltZXIuXG4gICAqL1xuICBkaXNhYmxlQ291bnRkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuY291bnRkb3duU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jb3VudGRvd25JbnRlcnZhbENvbXBvbmVudD8uc3RvcCgpO1xuICAgIHRoaXMuaGlkZUNvdW50ZG93biA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY291bnRkb3duIGJ1dHRvbiB0b29sdGlwIHRleHQgYmFzZWQgb24gdGhlIHN0YXRlIG9mIHRoZSBpbnRlcnZhbCByZWZyZXNoIHRvZ2dsZSBzdGF0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVDb3VudGRvd25CdXR0b25Ub29sdGlwVGV4dCgpOiB2b2lkO1xuXG4gIHByaXZhdGUgdHJpZ2dlckdhaW5zaWdodEV2ZW50KHdpZGdldFR5cGU6IFdpZGdldFR5cGUsIGFjdGlvbjogc3RyaW5nLCByZXN1bHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh3aWRnZXRUeXBlKSB7XG4gICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFxuICAgICAgICBQUk9EVUNUX0VYUEVSSUVOQ0VfSU5URVJWQUxfQkFTRURfUkVMT0FELkVWRU5UUy5JTlRFUlZBTF9CQVNFRF9SRUxPQUQsXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5kZXRlcm1pbmVDb21wb25lbnROYW1lKHdpZGdldFR5cGUpLFxuICAgICAgICAgIHdpZGdldDogd2lkZ2V0VHlwZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lQ29tcG9uZW50TmFtZSh3aWRnZXRUeXBlOiBXaWRnZXRUeXBlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHdpZGdldFR5cGUpIHtcbiAgICAgIGNhc2UgV0lER0VUX1RZUEVfVkFMVUVTLkFMQVJNUzpcbiAgICAgICAgcmV0dXJuIFBST0RVQ1RfRVhQRVJJRU5DRV9JTlRFUlZBTF9CQVNFRF9SRUxPQUQuQ09NUE9ORU5UUy5BTEFSTV9XSURHRVRfQUxBUk1fUkVMT0FEO1xuICAgICAgY2FzZSBXSURHRVRfVFlQRV9WQUxVRVMuREFUQV9QT0lOVFNfVEFCTEU6XG4gICAgICAgIHJldHVybiBQUk9EVUNUX0VYUEVSSUVOQ0VfSU5URVJWQUxfQkFTRURfUkVMT0FELkNPTVBPTkVOVFMuREFUQVBPSU5UU19SRUxPQUQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59XG4iXX0=