UNPKG

@codebakery/origami

Version:
153 lines 17.3 kB
import { __awaiter, __decorate, __generator, __param } from "tslib"; import { Directive, ElementRef, Inject, Optional, NgZone } from '@angular/core'; import { whenSet, wrapAndDefineDescriptor } from '@codebakery/origami/util'; import { camelToDashCase } from '@polymer/polymer/lib/utils/case-map'; import { POLYMER_HOST } from './polymerHost'; /** * This directive is attached to each `<template>` element. If a Polymer host * component is provided, this directive will enable Polymer's event and * two-way binding syntax styles. */ var TemplateDirective = /** @class */ (function () { function TemplateDirective(elementRef, polymerHost, zone) { var _this = this; this.elementRef = elementRef; this.polymerHost = polymerHost; this.zone = zone; this.ready = (function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (!this.polymerHost) return [3 /*break*/, 2]; this.enableEventBindings(elementRef.nativeElement); return [4 /*yield*/, this.enablePropertyBindings(elementRef.nativeElement)]; case 1: _a.sent(); _a.label = 2; case 2: return [2 /*return*/]; } }); }); })(); } /** * Enables the use of Polymer event bindings. An event binding is declared * with the syntax `on-event-name="handler"`, where `event-name` is the * name of the event to listen to and `handler` is the name of the host's * method to call when the event is dispatched. * * @param template the Polymer template to enable event binding syntax for */ TemplateDirective.prototype.enableEventBindings = function (template) { // When templatize looks for a PropertyEffects host, it will use the // template's __dataHost property. This is the _methodHost for a template // instance and is used to add event listener bindings. template.__dataHost = this.polymerHost; }; /** * Enables the use of Polymer property bindings. A property binding is * declared either as a one-way binding `value="[[propName]]"` or a two-way * binding `value="{{propName}}"`. * * @param template the Polymer template to enable data binding syntax for */ TemplateDirective.prototype.enablePropertyBindings = function (template) { return __awaiter(this, void 0, void 0, function () { var hostProps, _loop_1, this_1, prop; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getTemplateInfo(template)]; case 1: hostProps = (_a.sent()).hostProps; if (hostProps) { _loop_1 = function (prop) { // Angular -> Polymer (one-way bindings) var initialValue = this_1.polymerHost[prop]; wrapAndDefineDescriptor(this_1.polymerHost, prop, { afterSet: function (changed, value) { if (changed) { template["_host_" + prop] = value; } } }); this_1.polymerHost[prop] = initialValue; // Polymer -> Angular (two-way bindings) var eventName = "_host_" + camelToDashCase(prop) + "-changed"; template.addEventListener(eventName, function (event) { if (!_this.isSplicesChange(event) && !_this.isPathChange(event)) { _this.zone.run(function () { _this.polymerHost[prop] = event.detail.value; }); } }); }; this_1 = this; for (prop in hostProps) { _loop_1(prop); } } return [2 /*return*/]; } }); }); }; /** * Retrieves the template info metadata for a Polymer template. * * @param template the Polymer template to retrieve template info for * @returns a Promise that resolves with the template's info */ TemplateDirective.prototype.getTemplateInfo = function (template) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (!template._templateInfo) return [3 /*break*/, 1]; return [2 /*return*/, template._templateInfo]; case 1: return [4 /*yield*/, whenSet(template, '_templateInfo')]; case 2: return [2 /*return*/, _a.sent()]; } }); }); }; /** * Indicates whether or not an event is a "splices" Polymer change event, * which has a detail value object that dictates what elements were changed if * the array reference remains the same. * * @param event the event to check * @returns true if the event is a splices change event */ TemplateDirective.prototype.isSplicesChange = function (event) { var value = event.detail.value; return value && Array.isArray(value.indexSplices); }; /** * Indicates whether or not an event is a path Polymer change event, which * has a detail path property indicating the path of the value changed, and a * value of the path's value. This is used when an array or object reference * remains the same. * * @param event the event to check * @returns true if the event is a path change event */ TemplateDirective.prototype.isPathChange = function (event) { return typeof event.detail.path === 'string'; }; TemplateDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: undefined, decorators: [{ type: Inject, args: [POLYMER_HOST,] }, { type: Optional }] }, { type: NgZone } ]; }; TemplateDirective = __decorate([ Directive({ selector: 'template' }), __param(1, Inject(POLYMER_HOST)), __param(1, Optional()) ], TemplateDirective); return TemplateDirective; }()); export { TemplateDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS90ZW1wbGF0ZXMvIiwic291cmNlcyI6WyJzcmMvdGVtcGxhdGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFzQjdDOzs7O0dBSUc7QUFJSDtJQUdFLDJCQUNTLFVBQXNCLEVBR3RCLFdBQWdCLEVBQ2YsSUFBWTtRQUx0QixpQkFhQztRQVpRLGVBQVUsR0FBVixVQUFVLENBQVk7UUFHdEIsZ0JBQVcsR0FBWCxXQUFXLENBQUs7UUFDZixTQUFJLEdBQUosSUFBSSxDQUFRO1FBRXBCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQzs7Ozs2QkFDUixJQUFJLENBQUMsV0FBVyxFQUFoQix3QkFBZ0I7d0JBQ2xCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ25ELHFCQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUE7O3dCQUEzRCxTQUEyRCxDQUFDOzs7OzthQUUvRCxDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsK0NBQW1CLEdBQW5CLFVBQW9CLFFBQXlCO1FBQzNDLG9FQUFvRTtRQUNwRSx5RUFBeUU7UUFDekUsdURBQXVEO1FBQ3ZELFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0csa0RBQXNCLEdBQTVCLFVBQTZCLFFBQXlCOzs7Ozs7NEJBQzlCLHFCQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUE7O3dCQUFsRCxTQUFTLEdBQUssQ0FBQSxTQUFvQyxDQUFBLFVBQXpDO3dCQUNqQixJQUFJLFNBQVMsRUFBRTtnREFDSixJQUFJO2dDQUNYLHdDQUF3QztnQ0FDeEMsSUFBTSxZQUFZLEdBQUcsT0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQzVDLHVCQUF1QixDQUFDLE9BQUssV0FBVyxFQUFFLElBQUksRUFBRTtvQ0FDOUMsUUFBUSxFQUFSLFVBQVMsT0FBZ0IsRUFBRSxLQUFVO3dDQUNuQyxJQUFJLE9BQU8sRUFBRTs0Q0FDWCxRQUFRLENBQUMsV0FBUyxJQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7eUNBQ25DO29DQUNILENBQUM7aUNBQ0YsQ0FBQyxDQUFDO2dDQUVILE9BQUssV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQztnQ0FFdEMsd0NBQXdDO2dDQUN4QyxJQUFNLFNBQVMsR0FBRyxXQUFTLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBVSxDQUFDO2dDQUMzRCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQUEsS0FBSztvQ0FDeEMsSUFDRSxDQUFDLEtBQUksQ0FBQyxlQUFlLENBQWMsS0FBSyxDQUFDO3dDQUN6QyxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQWMsS0FBSyxDQUFDLEVBQ3RDO3dDQUNBLEtBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDOzRDQUNaLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQWlCLEtBQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO3dDQUM3RCxDQUFDLENBQUMsQ0FBQztxQ0FDSjtnQ0FDSCxDQUFDLENBQUMsQ0FBQzs7OzRCQXhCTCxLQUFTLElBQUksSUFBSSxTQUFTO3dDQUFqQixJQUFJOzZCQXlCWjt5QkFDRjs7Ozs7S0FDRjtJQUVEOzs7OztPQUtHO0lBQ0csMkNBQWUsR0FBckIsVUFBc0IsUUFBeUI7Ozs7OzZCQUN6QyxRQUFRLENBQUMsYUFBYSxFQUF0Qix3QkFBc0I7d0JBQ3hCLHNCQUFPLFFBQVEsQ0FBQyxhQUFhLEVBQUM7NEJBRXZCLHFCQUFNLE9BQU8sQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLEVBQUE7NEJBQS9DLHNCQUFPLFNBQXdDLEVBQUM7Ozs7S0FFbkQ7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssMkNBQWUsR0FBdkIsVUFBd0IsS0FBa0I7UUFDeEMsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakMsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssd0NBQVksR0FBcEIsVUFBcUIsS0FBa0I7UUFDckMsT0FBTyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztJQUMvQyxDQUFDOztnQkExR29CLFVBQVU7Z0RBQzVCLE1BQU0sU0FBQyxZQUFZLGNBQ25CLFFBQVE7Z0JBRUssTUFBTTs7SUFSWCxpQkFBaUI7UUFIN0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLFVBQVU7U0FDckIsQ0FBQztRQU1HLFdBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3BCLFdBQUEsUUFBUSxFQUFFLENBQUE7T0FORixpQkFBaUIsQ0ErRzdCO0lBQUQsd0JBQUM7Q0FBQSxBQS9HRCxJQStHQztTQS9HWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEluamVjdCwgT3B0aW9uYWwsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgd2hlblNldCwgd3JhcEFuZERlZmluZURlc2NyaXB0b3IgfSBmcm9tICdAY29kZWJha2VyeS9vcmlnYW1pL3V0aWwnO1xuaW1wb3J0IHsgY2FtZWxUb0Rhc2hDYXNlIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvY2FzZS1tYXAnO1xuaW1wb3J0IHsgVGVtcGxhdGVJbmZvIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBPTFlNRVJfSE9TVCB9IGZyb20gJy4vcG9seW1lckhvc3QnO1xuXG4vKipcbiAqIEFuIEhUTUxUZW1wbGF0ZUVsZW1lbnQgdGhhdCBpcyBwcm9jZXNzZWQgYnkgUG9seW1lcidzIHRlbXBsYXRpemVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbHltZXJUZW1wbGF0ZSBleHRlbmRzIEhUTUxUZW1wbGF0ZUVsZW1lbnQge1xuICAvKipcbiAgICogQWRkZWQgYnkgdGhlIGBQcm9wZXJ0eUVmZmVjdHNgIG1peGluIHRvIGluc3RydWN0IHRlbXBsYXRpemUgb2YgdGhlIGhvc3RcbiAgICogZm9yIHRoZSB0ZW1wbGF0ZS4gRWZmZWN0cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2Ugd2lsbFxuICAgKiBwcm9wYWdhdGUgdG8gdGhpcyBob3N0LlxuICAgKi9cbiAgX19kYXRhSG9zdD86IGFueTtcbiAgLyoqXG4gICAqIFRlbXBsYXRlIG1ldGFkYXRhIGdlbmVyYXRlZCBmcm9tIGBUZW1wbGF0ZVN0YW1wYC5cbiAgICovXG4gIF90ZW1wbGF0ZUluZm8/OiBUZW1wbGF0ZUluZm87XG4gIC8qKlxuICAgKiBIb3N0IHByb3BlcnRpZXMgYXJlIGRlZmluZWQgYXMgYF9ob3N0X3Byb3BOYW1lYCBieSB0ZW1wbGF0aXplci5cbiAgICovXG4gIFtob3N0UHJvcDogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGlzIGF0dGFjaGVkIHRvIGVhY2ggYDx0ZW1wbGF0ZT5gIGVsZW1lbnQuIElmIGEgUG9seW1lciBob3N0XG4gKiBjb21wb25lbnQgaXMgcHJvdmlkZWQsIHRoaXMgZGlyZWN0aXZlIHdpbGwgZW5hYmxlIFBvbHltZXIncyBldmVudCBhbmRcbiAqIHR3by13YXkgYmluZGluZyBzeW50YXggc3R5bGVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICd0ZW1wbGF0ZSdcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVEaXJlY3RpdmUge1xuICByZWFkeTogUHJvbWlzZTx2b2lkPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KFBPTFlNRVJfSE9TVClcbiAgICBAT3B0aW9uYWwoKVxuICAgIHB1YmxpYyBwb2x5bWVySG9zdDogYW55LFxuICAgIHByaXZhdGUgem9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMucmVhZHkgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucG9seW1lckhvc3QpIHtcbiAgICAgICAgdGhpcy5lbmFibGVFdmVudEJpbmRpbmdzKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUHJvcGVydHlCaW5kaW5ncyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIFBvbHltZXIgZXZlbnQgYmluZGluZ3MuIEFuIGV2ZW50IGJpbmRpbmcgaXMgZGVjbGFyZWRcbiAgICogd2l0aCB0aGUgc3ludGF4IGBvbi1ldmVudC1uYW1lPVwiaGFuZGxlclwiYCwgd2hlcmUgYGV2ZW50LW5hbWVgIGlzIHRoZVxuICAgKiBuYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gdG8gYW5kIGBoYW5kbGVyYCBpcyB0aGUgbmFtZSBvZiB0aGUgaG9zdCdzXG4gICAqIG1ldGhvZCB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIGRpc3BhdGNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZSB0aGUgUG9seW1lciB0ZW1wbGF0ZSB0byBlbmFibGUgZXZlbnQgYmluZGluZyBzeW50YXggZm9yXG4gICAqL1xuICBlbmFibGVFdmVudEJpbmRpbmdzKHRlbXBsYXRlOiBQb2x5bWVyVGVtcGxhdGUpIHtcbiAgICAvLyBXaGVuIHRlbXBsYXRpemUgbG9va3MgZm9yIGEgUHJvcGVydHlFZmZlY3RzIGhvc3QsIGl0IHdpbGwgdXNlIHRoZVxuICAgIC8vIHRlbXBsYXRlJ3MgX19kYXRhSG9zdCBwcm9wZXJ0eS4gVGhpcyBpcyB0aGUgX21ldGhvZEhvc3QgZm9yIGEgdGVtcGxhdGVcbiAgICAvLyBpbnN0YW5jZSBhbmQgaXMgdXNlZCB0byBhZGQgZXZlbnQgbGlzdGVuZXIgYmluZGluZ3MuXG4gICAgdGVtcGxhdGUuX19kYXRhSG9zdCA9IHRoaXMucG9seW1lckhvc3Q7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIFBvbHltZXIgcHJvcGVydHkgYmluZGluZ3MuIEEgcHJvcGVydHkgYmluZGluZyBpc1xuICAgKiBkZWNsYXJlZCBlaXRoZXIgYXMgYSBvbmUtd2F5IGJpbmRpbmcgYHZhbHVlPVwiW1twcm9wTmFtZV1dXCJgIG9yIGEgdHdvLXdheVxuICAgKiBiaW5kaW5nIGB2YWx1ZT1cInt7cHJvcE5hbWV9fVwiYC5cbiAgICpcbiAgICogQHBhcmFtIHRlbXBsYXRlIHRoZSBQb2x5bWVyIHRlbXBsYXRlIHRvIGVuYWJsZSBkYXRhIGJpbmRpbmcgc3ludGF4IGZvclxuICAgKi9cbiAgYXN5bmMgZW5hYmxlUHJvcGVydHlCaW5kaW5ncyh0ZW1wbGF0ZTogUG9seW1lclRlbXBsYXRlKSB7XG4gICAgY29uc3QgeyBob3N0UHJvcHMgfSA9IGF3YWl0IHRoaXMuZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBpZiAoaG9zdFByb3BzKSB7XG4gICAgICBmb3IgKGxldCBwcm9wIGluIGhvc3RQcm9wcykge1xuICAgICAgICAvLyBBbmd1bGFyIC0+IFBvbHltZXIgKG9uZS13YXkgYmluZGluZ3MpXG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMucG9seW1lckhvc3RbcHJvcF07XG4gICAgICAgIHdyYXBBbmREZWZpbmVEZXNjcmlwdG9yKHRoaXMucG9seW1lckhvc3QsIHByb3AsIHtcbiAgICAgICAgICBhZnRlclNldChjaGFuZ2VkOiBib29sZWFuLCB2YWx1ZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICB0ZW1wbGF0ZVtgX2hvc3RfJHtwcm9wfWBdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBvbHltZXJIb3N0W3Byb3BdID0gaW5pdGlhbFZhbHVlO1xuXG4gICAgICAgIC8vIFBvbHltZXIgLT4gQW5ndWxhciAodHdvLXdheSBiaW5kaW5ncylcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gYF9ob3N0XyR7Y2FtZWxUb0Rhc2hDYXNlKHByb3ApfS1jaGFuZ2VkYDtcbiAgICAgICAgdGVtcGxhdGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5pc1NwbGljZXNDaGFuZ2UoPEN1c3RvbUV2ZW50PmV2ZW50KSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNQYXRoQ2hhbmdlKDxDdXN0b21FdmVudD5ldmVudClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnBvbHltZXJIb3N0W3Byb3BdID0gKDxDdXN0b21FdmVudD5ldmVudCkuZGV0YWlsLnZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB0ZW1wbGF0ZSBpbmZvIG1ldGFkYXRhIGZvciBhIFBvbHltZXIgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZSB0aGUgUG9seW1lciB0ZW1wbGF0ZSB0byByZXRyaWV2ZSB0ZW1wbGF0ZSBpbmZvIGZvclxuICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0ZW1wbGF0ZSdzIGluZm9cbiAgICovXG4gIGFzeW5jIGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZTogUG9seW1lclRlbXBsYXRlKTogUHJvbWlzZTxUZW1wbGF0ZUluZm8+IHtcbiAgICBpZiAodGVtcGxhdGUuX3RlbXBsYXRlSW5mbykge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhd2FpdCB3aGVuU2V0KHRlbXBsYXRlLCAnX3RlbXBsYXRlSW5mbycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYW4gZXZlbnQgaXMgYSBcInNwbGljZXNcIiBQb2x5bWVyIGNoYW5nZSBldmVudCxcbiAgICogd2hpY2ggaGFzIGEgZGV0YWlsIHZhbHVlIG9iamVjdCB0aGF0IGRpY3RhdGVzIHdoYXQgZWxlbWVudHMgd2VyZSBjaGFuZ2VkIGlmXG4gICAqIHRoZSBhcnJheSByZWZlcmVuY2UgcmVtYWlucyB0aGUgc2FtZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBpcyBhIHNwbGljZXMgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGlzU3BsaWNlc0NoYW5nZShldmVudDogQ3VzdG9tRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5pbmRleFNwbGljZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbiBldmVudCBpcyBhIHBhdGggUG9seW1lciBjaGFuZ2UgZXZlbnQsIHdoaWNoXG4gICAqIGhhcyBhIGRldGFpbCBwYXRoIHByb3BlcnR5IGluZGljYXRpbmcgdGhlIHBhdGggb2YgdGhlIHZhbHVlIGNoYW5nZWQsIGFuZCBhXG4gICAqIHZhbHVlIG9mIHRoZSBwYXRoJ3MgdmFsdWUuIFRoaXMgaXMgdXNlZCB3aGVuIGFuIGFycmF5IG9yIG9iamVjdCByZWZlcmVuY2VcbiAgICogcmVtYWlucyB0aGUgc2FtZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBpcyBhIHBhdGggY2hhbmdlIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGlzUGF0aENoYW5nZShldmVudDogQ3VzdG9tRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGV2ZW50LmRldGFpbC5wYXRoID09PSAnc3RyaW5nJztcbiAgfVxufVxuIl19