UNPKG

@ngbracket/ngx-layout

Version:
145 lines 18.2 kB
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { DOCUMENT } from '@angular/common'; import { BEFORE_APP_SERIALIZED } from '@angular/platform-server'; import { BREAKPOINTS, CLASS_NAME, MediaMarshaller, SERVER_TOKEN, sortAscendingPriority, StylesheetMap, ɵMatchMedia as MatchMedia, } from '@ngbracket/ngx-layout/core'; import { ServerMatchMedia } from './server-match-media'; import { CSP_NONCE, Inject, Optional } from '@angular/core'; /** * Activate all the registered breakpoints in sequence, and then * retrieve the associated stylings from the virtual stylesheet * @param serverSheet the virtual stylesheet that stores styles for each * element * @param mediaController the MatchMedia service to activate/deactivate breakpoints * @param breakpoints the registered breakpoints to activate/deactivate * @param mediaMarshaller the MediaMarshaller service to disable fallback styles dynamically */ export function generateStaticFlexLayoutStyles(serverSheet, mediaController, breakpoints, mediaMarshaller) { // Store the custom classes in the following map, that way only // one class gets allocated per HTMLElement, and each class can // be referenced in the static media queries const classMap = new Map(); // Get the initial stylings for all the directives, // and initialize the fallback block of stylings. const defaultStyles = new Map(serverSheet.stylesheet); // Reset the class counter, otherwise class numbers will // increase with each server render. nextId = 0; let styleText = generateCss(defaultStyles, 'all', classMap); mediaMarshaller.useFallbacks = false; [...breakpoints].sort(sortAscendingPriority).forEach((bp) => { serverSheet.clearStyles(); mediaController.activateBreakpoint(bp); const stylesheet = new Map(serverSheet.stylesheet); if (stylesheet.size > 0) { styleText += generateCss(stylesheet, bp.mediaQuery, classMap); } mediaController.deactivateBreakpoint(bp); }); return styleText; } /** * Create a style tag populated with the dynamic stylings from Flex * components and attach it to the head of the DOM */ export function FLEX_SSR_SERIALIZER_FACTORY(serverSheet, mediaController, _document, breakpoints, mediaMarshaller, _nonce) { return () => { // This is the style tag that gets inserted into the head of the DOM, // populated with the manual media queries const styleTag = _document.createElement('style'); if (_nonce) { styleTag.setAttribute('nonce', _nonce); } const styleText = generateStaticFlexLayoutStyles(serverSheet, mediaController, breakpoints, mediaMarshaller); styleTag.classList.add(`${CLASS_NAME}ssr`); styleTag.textContent = styleText; _document.head.appendChild(styleTag); }; } /** * Provider to set static styles on the server */ export const SERVER_PROVIDERS = [ { provide: BEFORE_APP_SERIALIZED, useFactory: FLEX_SSR_SERIALIZER_FACTORY, deps: [ StylesheetMap, MatchMedia, DOCUMENT, BREAKPOINTS, MediaMarshaller, [new Optional(), new Inject(CSP_NONCE)], ], multi: true, }, { provide: SERVER_TOKEN, useValue: true, }, { provide: MatchMedia, useClass: ServerMatchMedia, }, ]; let nextId = 0; const IS_DEBUG_MODE = false; /** * create @media queries based on a virtual stylesheet * * Adds a unique class to each element and stores it * in a shared classMap for later reuse * @param stylesheet the virtual stylesheet that stores styles for each * element * @param mediaQuery the given @media CSS selector for the current breakpoint * @param classMap the map of HTML elements to class names to avoid duplications */ function generateCss(stylesheet, mediaQuery, classMap) { let css = ''; stylesheet.forEach((styles, el) => { let keyVals = ''; let className = getClassName(el, classMap); styles.forEach((v, k) => { keyVals += v ? format(`${k}:${v};`) : ''; }); if (keyVals) { // Build list of CSS styles; each with a className css += format(`.${className} {`, keyVals, '}'); } }); // Group 1 or more styles (each with className) in a specific mediaQuery return format(`@media ${mediaQuery} {`, css, '}'); } /** * For debugging purposes, prefix css segment with linefeed(s) for easy * debugging purposes. */ function format(...list) { let result = ''; list.forEach((css, i) => { result += IS_DEBUG_MODE ? formatSegment(css, i !== 0) : css; }); return result; } function formatSegment(css, asPrefix = true) { return asPrefix ? `\n${css}` : `${css}\n`; } /** * Get className associated with CSS styling * If not found, generate global className and set * association. */ function getClassName(element, classMap) { let className = classMap.get(element); if (!className) { className = `${CLASS_NAME}${nextId++}`; classMap.set(element, className); } element.classList.add(className); return className; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGlicy9mbGV4LWxheW91dC9zZXJ2ZXIvc2VydmVyLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxPQUFPLEVBRUwsV0FBVyxFQUNYLFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsV0FBVyxJQUFJLFVBQVUsR0FDMUIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsOEJBQThCLENBQzVDLFdBQTBCLEVBQzFCLGVBQWlDLEVBQ2pDLFdBQXlCLEVBQ3pCLGVBQWdDO0lBRWhDLCtEQUErRDtJQUMvRCwrREFBK0Q7SUFDL0QsNENBQTRDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO0lBRWhELG1EQUFtRDtJQUNuRCxpREFBaUQ7SUFDakQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELHdEQUF3RDtJQUN4RCxvQ0FBb0M7SUFDcEMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNYLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVELGVBQWUsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJD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QUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFakMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQkVGT1JFX0FQUF9TRVJJQUxJWkVEIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tc2VydmVyJztcbmltcG9ydCB7XG4gIEJyZWFrUG9pbnQsXG4gIEJSRUFLUE9JTlRTLFxuICBDTEFTU19OQU1FLFxuICBNZWRpYU1hcnNoYWxsZXIsXG4gIFNFUlZFUl9UT0tFTixcbiAgc29ydEFzY2VuZGluZ1ByaW9yaXR5LFxuICBTdHlsZXNoZWV0TWFwLFxuICDJtU1hdGNoTWVkaWEgYXMgTWF0Y2hNZWRpYSxcbn0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2NvcmUnO1xuXG5pbXBvcnQgeyBTZXJ2ZXJNYXRjaE1lZGlhIH0gZnJvbSAnLi9zZXJ2ZXItbWF0Y2gtbWVkaWEnO1xuaW1wb3J0IHsgQ1NQX05PTkNFLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogQWN0aXZhdGUgYWxsIHRoZSByZWdpc3RlcmVkIGJyZWFrcG9pbnRzIGluIHNlcXVlbmNlLCBhbmQgdGhlblxuICogcmV0cmlldmUgdGhlIGFzc29jaWF0ZWQgc3R5bGluZ3MgZnJvbSB0aGUgdmlydHVhbCBzdHlsZXNoZWV0XG4gKiBAcGFyYW0gc2VydmVyU2hlZXQgdGhlIHZpcnR1YWwgc3R5bGVzaGVldCB0aGF0IHN0b3JlcyBzdHlsZXMgZm9yIGVhY2hcbiAqICAgICAgICBlbGVtZW50XG4gKiBAcGFyYW0gbWVkaWFDb250cm9sbGVyIHRoZSBNYXRjaE1lZGlhIHNlcnZpY2UgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZSBicmVha3BvaW50c1xuICogQHBhcmFtIGJyZWFrcG9pbnRzIHRoZSByZWdpc3RlcmVkIGJyZWFrcG9pbnRzIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGVcbiAqIEBwYXJhbSBtZWRpYU1hcnNoYWxsZXIgdGhlIE1lZGlhTWFyc2hhbGxlciBzZXJ2aWNlIHRvIGRpc2FibGUgZmFsbGJhY2sgc3R5bGVzIGR5bmFtaWNhbGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YXRpY0ZsZXhMYXlvdXRTdHlsZXMoXG4gIHNlcnZlclNoZWV0OiBTdHlsZXNoZWV0TWFwLFxuICBtZWRpYUNvbnRyb2xsZXI6IFNlcnZlck1hdGNoTWVkaWEsXG4gIGJyZWFrcG9pbnRzOiBCcmVha1BvaW50W10sXG4gIG1lZGlhTWFyc2hhbGxlcjogTWVkaWFNYXJzaGFsbGVyXG4pIHtcbiAgLy8gU3RvcmUgdGhlIGN1c3RvbSBjbGFzc2VzIGluIHRoZSBmb2xsb3dpbmcgbWFwLCB0aGF0IHdheSBvbmx5XG4gIC8vIG9uZSBjbGFzcyBnZXRzIGFsbG9jYXRlZCBwZXIgSFRNTEVsZW1lbnQsIGFuZCBlYWNoIGNsYXNzIGNhblxuICAvLyBiZSByZWZlcmVuY2VkIGluIHRoZSBzdGF0aWMgbWVkaWEgcXVlcmllc1xuICBjb25zdCBjbGFzc01hcCA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIHN0cmluZz4oKTtcblxuICAvLyBHZXQgdGhlIGluaXRpYWwgc3R5bGluZ3MgZm9yIGFsbCB0aGUgZGlyZWN0aXZlcyxcbiAgLy8gYW5kIGluaXRpYWxpemUgdGhlIGZhbGxiYWNrIGJsb2NrIG9mIHN0eWxpbmdzLlxuICBjb25zdCBkZWZhdWx0U3R5bGVzID0gbmV3IE1hcChzZXJ2ZXJTaGVldC5zdHlsZXNoZWV0KTtcbiAgLy8gUmVzZXQgdGhlIGNsYXNzIGNvdW50ZXIsIG90aGVyd2lzZSBjbGFzcyBudW1iZXJzIHdpbGxcbiAgLy8gaW5jcmVhc2Ugd2l0aCBlYWNoIHNlcnZlciByZW5kZXIuXG4gIG5leHRJZCA9IDA7XG4gIGxldCBzdHlsZVRleHQgPSBnZW5lcmF0ZUNzcyhkZWZhdWx0U3R5bGVzLCAnYWxsJywgY2xhc3NNYXApO1xuICBtZWRpYU1hcnNoYWxsZXIudXNlRmFsbGJhY2tzID0gZmFsc2U7XG5cbiAgWy4uLmJyZWFrcG9pbnRzXS5zb3J0KHNvcnRBc2NlbmRpbmdQcmlvcml0eSkuZm9yRWFjaCgoYnApID0+IHtcbiAgICBzZXJ2ZXJTaGVldC5jbGVhclN0eWxlcygpO1xuICAgIG1lZGlhQ29udHJvbGxlci5hY3RpdmF0ZUJyZWFrcG9pbnQoYnApO1xuICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBuZXcgTWFwKHNlcnZlclNoZWV0LnN0eWxlc2hlZXQpO1xuICAgIGlmIChzdHlsZXNoZWV0LnNpemUgPiAwKSB7XG4gICAgICBzdHlsZVRleHQgKz0gZ2VuZXJhdGVDc3Moc3R5bGVzaGVldCwgYnAubWVkaWFRdWVyeSwgY2xhc3NNYXApO1xuICAgIH1cbiAgICBtZWRpYUNvbnRyb2xsZXIuZGVhY3RpdmF0ZUJyZWFrcG9pbnQoYnApO1xuICB9KTtcblxuICByZXR1cm4gc3R5bGVUZXh0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0eWxlIHRhZyBwb3B1bGF0ZWQgd2l0aCB0aGUgZHluYW1pYyBzdHlsaW5ncyBmcm9tIEZsZXhcbiAqIGNvbXBvbmVudHMgYW5kIGF0dGFjaCBpdCB0byB0aGUgaGVhZCBvZiB0aGUgRE9NXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGTEVYX1NTUl9TRVJJQUxJWkVSX0ZBQ1RPUlkoXG4gIHNlcnZlclNoZWV0OiBTdHlsZXNoZWV0TWFwLFxuICBtZWRpYUNvbnRyb2xsZXI6IFNlcnZlck1hdGNoTWVkaWEsXG4gIF9kb2N1bWVudDogRG9jdW1lbnQsXG4gIGJyZWFrcG9pbnRzOiBCcmVha1BvaW50W10sXG4gIG1lZGlhTWFyc2hhbGxlcjogTWVkaWFNYXJzaGFsbGVyLFxuICBfbm9uY2U/OiBzdHJpbmdcbikge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIC8vIFRoaXMgaXMgdGhlIHN0eWxlIHRhZyB0aGF0IGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgaGVhZCBvZiB0aGUgRE9NLFxuICAgIC8vIHBvcHVsYXRlZCB3aXRoIHRoZSBtYW51YWwgbWVkaWEgcXVlcmllc1xuICAgIGNvbnN0IHN0eWxlVGFnID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgaWYgKF9ub25jZSkge1xuICAgICAgc3R5bGVUYWcuc2V0QXR0cmlidXRlKCdub25jZScsIF9ub25jZSk7XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlVGV4dCA9IGdlbmVyYXRlU3RhdGljRmxleExheW91dFN0eWxlcyhcbiAgICAgIHNlcnZlclNoZWV0LFxuICAgICAgbWVkaWFDb250cm9sbGVyLFxuICAgICAgYnJlYWtwb2ludHMsXG4gICAgICBtZWRpYU1hcnNoYWxsZXJcbiAgICApO1xuICAgIHN0eWxlVGFnLmNsYXNzTGlzdC5hZGQoYCR7Q0xBU1NfTkFNRX1zc3JgKTtcbiAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IHN0eWxlVGV4dDtcbiAgICBfZG9jdW1lbnQuaGVhZCEuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICB9O1xufVxuXG4vKipcbiAqICBQcm92aWRlciB0byBzZXQgc3RhdGljIHN0eWxlcyBvbiB0aGUgc2VydmVyXG4gKi9cbmV4cG9ydCBjb25zdCBTRVJWRVJfUFJPVklERVJTID0gW1xuICB7XG4gICAgcHJvdmlkZTogQkVGT1JFX0FQUF9TRVJJQUxJWkVELFxuICAgIHVzZUZhY3Rvcnk6IEZMRVhfU1NSX1NFUklBTElaRVJfRkFDVE9SWSxcbiAgICBkZXBzOiBbXG4gICAgICBTdHlsZXNoZWV0TWFwLFxuICAgICAgTWF0Y2hNZWRpYSxcbiAgICAgIERPQ1VNRU5ULFxuICAgICAgQlJFQUtQT0lOVFMsXG4gICAgICBNZWRpYU1hcnNoYWxsZXIsXG4gICAgICBbbmV3IE9wdGlvbmFsKCksIG5ldyBJbmplY3QoQ1NQX05PTkNFKV0sXG4gICAgXSxcbiAgICBtdWx0aTogdHJ1ZSxcbiAgfSxcbiAge1xuICAgIHByb3ZpZGU6IFNFUlZFUl9UT0tFTixcbiAgICB1c2VWYWx1ZTogdHJ1ZSxcbiAgfSxcbiAge1xuICAgIHByb3ZpZGU6IE1hdGNoTWVkaWEsXG4gICAgdXNlQ2xhc3M6IFNlcnZlck1hdGNoTWVkaWEsXG4gIH0sXG5dO1xuXG5sZXQgbmV4dElkID0gMDtcbmNvbnN0IElTX0RFQlVHX01PREUgPSBmYWxzZTtcblxuZXhwb3J0IHR5cGUgU3R5bGVTaGVldCA9IE1hcDxIVE1MRWxlbWVudCwgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj47XG5leHBvcnQgdHlwZSBDbGFzc01hcCA9IE1hcDxIVE1MRWxlbWVudCwgc3RyaW5nPjtcblxuLyoqXG4gKiBjcmVhdGUgQG1lZGlhIHF1ZXJpZXMgYmFzZWQgb24gYSB2aXJ0dWFsIHN0eWxlc2hlZXRcbiAqICogQWRkcyBhIHVuaXF1ZSBjbGFzcyB0byBlYWNoIGVsZW1lbnQgYW5kIHN0b3JlcyBpdFxuICogICBpbiBhIHNoYXJlZCBjbGFzc01hcCBmb3IgbGF0ZXIgcmV1c2VcbiAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSB2aXJ0dWFsIHN0eWxlc2hlZXQgdGhhdCBzdG9yZXMgc3R5bGVzIGZvciBlYWNoXG4gKiAgICAgICAgZWxlbWVudFxuICogQHBhcmFtIG1lZGlhUXVlcnkgdGhlIGdpdmVuIEBtZWRpYSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJyZWFrcG9pbnRcbiAqIEBwYXJhbSBjbGFzc01hcCB0aGUgbWFwIG9mIEhUTUwgZWxlbWVudHMgdG8gY2xhc3MgbmFtZXMgdG8gYXZvaWQgZHVwbGljYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ3NzKFxuICBzdHlsZXNoZWV0OiBTdHlsZVNoZWV0LFxuICBtZWRpYVF1ZXJ5OiBzdHJpbmcsXG4gIGNsYXNzTWFwOiBDbGFzc01hcFxuKSB7XG4gIGxldCBjc3MgPSAnJztcbiAgc3R5bGVzaGVldC5mb3JFYWNoKChzdHlsZXMsIGVsKSA9PiB7XG4gICAgbGV0IGtleVZhbHMgPSAnJztcbiAgICBsZXQgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGVsLCBjbGFzc01hcCk7XG5cbiAgICBzdHlsZXMuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAga2V5VmFscyArPSB2ID8gZm9ybWF0KGAke2t9OiR7dn07YCkgOiAnJztcbiAgICB9KTtcblxuICAgIGlmIChrZXlWYWxzKSB7XG4gICAgICAvLyBCdWlsZCBsaXN0IG9mIENTUyBzdHlsZXM7IGVhY2ggd2l0aCBhIGNsYXNzTmFtZVxuICAgICAgY3NzICs9IGZvcm1hdChgLiR7Y2xhc3NOYW1lfSB7YCwga2V5VmFscywgJ30nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEdyb3VwIDEgb3IgbW9yZSBzdHlsZXMgKGVhY2ggd2l0aCBjbGFzc05hbWUpIGluIGEgc3BlY2lmaWMgbWVkaWFRdWVyeVxuICByZXR1cm4gZm9ybWF0KGBAbWVkaWEgJHttZWRpYVF1ZXJ5fSB7YCwgY3NzLCAnfScpO1xufVxuXG4vKipcbiAqIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHByZWZpeCBjc3Mgc2VnbWVudCB3aXRoIGxpbmVmZWVkKHMpIGZvciBlYXN5XG4gKiBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdCguLi5saXN0OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGlzdC5mb3JFYWNoKChjc3MsIGkpID0+IHtcbiAgICByZXN1bHQgKz0gSVNfREVCVUdfTU9ERSA/IGZvcm1hdFNlZ21lbnQoY3NzLCBpICE9PSAwKSA6IGNzcztcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlZ21lbnQoY3NzOiBzdHJpbmcsIGFzUHJlZml4OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gIHJldHVybiBhc1ByZWZpeCA/IGBcXG4ke2Nzc31gIDogYCR7Y3NzfVxcbmA7XG59XG5cbi8qKlxuICogR2V0IGNsYXNzTmFtZSBhc3NvY2lhdGVkIHdpdGggQ1NTIHN0eWxpbmdcbiAqIElmIG5vdCBmb3VuZCwgZ2VuZXJhdGUgZ2xvYmFsIGNsYXNzTmFtZSBhbmQgc2V0XG4gKiBhc3NvY2lhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgY2xhc3NNYXA6IE1hcDxIVE1MRWxlbWVudCwgc3RyaW5nPlxuKSB7XG4gIGxldCBjbGFzc05hbWUgPSBjbGFzc01hcC5nZXQoZWxlbWVudCk7XG4gIGlmICghY2xhc3NOYW1lKSB7XG4gICAgY2xhc3NOYW1lID0gYCR7Q0xBU1NfTkFNRX0ke25leHRJZCsrfWA7XG4gICAgY2xhc3NNYXAuc2V0KGVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cbiAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG5cbiAgcmV0dXJuIGNsYXNzTmFtZTtcbn1cbiJdfQ==