com.phloxui
Version:
PhloxUI Ng2+ Framework
169 lines (168 loc) • 26.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { DataUtils } from '../share/utils/DataUtils';
import { ArrayUtils } from '../share/utils/ArrayUtils';
/**
* @param {?=} key
* @return {?}
*/
export function Option(key) {
var /** @type {?} */ OPTIONS_KEY = "options";
// add option to _options_
return function (target, propertyKey, descriptor) {
var /** @type {?} */ propKey = key || propertyKey;
var /** @type {?} */ optionsMap = target['_options_'];
if (!Object.prototype.hasOwnProperty.call(target, '_options_')) {
var /** @type {?} */ parentOptionsMap = optionsMap;
if (typeof parentOptionsMap === 'object') {
// Inherit optionsMap from super class
optionsMap = JSON.parse(JSON.stringify(parentOptionsMap));
}
else {
optionsMap = {};
}
Object.defineProperty(target, '_options_', {
value: optionsMap,
enumerable: false,
writable: false
});
}
// { propKey: <class-property-key> }
optionsMap[propKey] = propertyKey;
// We're going to wrap ngOnInit() to intercept the function call to initialize @Option() fields first.
if (typeof target['ngOnInit'] === 'function' && !target['_optionsNgOnInitWrapped_']) {
// Keep original ngOnInit() function to call it later.
var /** @type {?} */ originalInit_1 = target['ngOnInit'];
// Re-implement the ngOnInit() function.
target['ngOnInit'] = function () {
// We've to check the flag "_optionsNgOnInitExecuted_" to make sure that it will be executed only once.
if (!this['_optionsNgOnInitExecuted_']) {
// Call this.setOptions() to auto resolve @Option() field values
// Passing overwrite = false means not to auto resolve the fields having value !== undefined.
this.setOptions(this.options, false);
this['_optionsNgOnInitExecuted_'] = true;
}
// Call original ngOnInit()
// Call original ngOnInit()
originalInit_1.call(this);
};
target['_optionsNgOnInitWrapped_'] = true;
}
// We're going to wrap setOptions() to intercept the function call to auto resolve @Option() fields.
if (typeof target['setOptions'] === 'function' && !target['_optionsSetOptionsWrapped_']) {
// Keep original setOptions() function to call it later.
var /** @type {?} */ originalSetOptions_1 = target['setOptions'];
// Re-implement the setOptions() function.
target['setOptions'] = function (options, overwrite) {
if (overwrite === void 0) { overwrite = true; }
if (this['_options_'] !== null && typeof this['_options_'] !== 'undefined') {
var _loop_1 = function (optionKey) {
var /** @type {?} */ propKey_1 = this_1['_options_'][optionKey] || optionKey;
var /** @type {?} */ optionValue = this_1[propKey_1];
if (options !== null && typeof options !== 'undefined') {
var /** @type {?} */ optionsToApply_1 = undefined;
if (DataUtils.containsDataKey(optionKey, options)) {
// We'll only override @Option field value if it is specified in options object only.
// Use DataUtils.getDataValue() here to support dot notation (.): foo.bar
// We'll only override @Option field value if it is specified in options object only.
// Use DataUtils.getDataValue() here to support dot notation (.): foo.bar
optionsToApply_1 = DataUtils.getDataValue(optionKey, options);
}
else if (typeof this_1.getName === 'function') {
// Auto resolve @Option() value from parent's option object automatically.
// { compName: {compOptions} }
var /** @type {?} */ name_1 = this_1.getName();
if (name_1 !== null && typeof name_1 === 'string') {
var /** @type {?} */ optionsByName = options[name_1];
if (optionsByName !== null && typeof optionsByName === 'object') {
if (DataUtils.containsDataKey(optionKey, optionsByName)) {
// We'll only override @Option field value if it is specified in options object only.
// Use DataUtils.getDataValue() here to support dot notation (.): foo.bar
// We'll only override @Option field value if it is specified in options object only.
// Use DataUtils.getDataValue() here to support dot notation (.): foo.bar
optionsToApply_1 = DataUtils.getDataValue(optionKey, optionsByName);
}
}
}
}
if (optionsToApply_1 !== undefined) {
if (this_1[propKey_1] !== null && this_1[propKey_1] !== undefined && typeof this_1[propKey_1]['setOptions'] === 'function') {
// If this[propKey] is IHasOptions, chain the method call into it.
this_1[propKey_1].setOptions(optionsToApply_1);
}
else if (this_1[propKey_1] !== null && Array.isArray(this_1[propKey_1]) && ArrayUtils.isAllMemberHasPropertyTypeOf(this_1[propKey_1], 'setOptions', 'function')) {
// If this[propKey] is an array of IHasOptions, chain the method call into its member.
if (optionsToApply_1 !== null && Array.isArray(optionsToApply_1)) {
// If optionsToApply is an array, chain the method call 1-by-1.
var /** @type {?} */ idx = void 0;
for (idx = 0; idx < this_1[propKey_1].length && idx < optionsToApply_1.length; idx++) {
// Set options value 1-by-1.
this_1[propKey_1][idx].setOptions(optionsToApply_1[idx]);
}
for (; idx < this_1[propKey_1].length; idx++) {
// Set "null" options into all members left.
this_1[propKey_1][idx].setOptions(null);
}
}
else {
try {
// Else, chain method call with the same value on all members.
for (var _a = tslib_1.__values(this_1[propKey_1]), _b = _a.next(); !_b.done; _b = _a.next()) {
var member = _b.value;
member.setOptions(optionsToApply_1);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
}
}
else if (typeof this_1[propKey_1] !== undefined && this_1[propKey_1] instanceof EventEmitter) {
// If this property is EventEmitter, it might be ng @Output.
if (optionsToApply_1 instanceof EventEmitter && overwrite) {
// The option value is EventEmitter also.
// We'll overwrite the value only if "overwrite" is set.
this_1[propKey_1] = optionsToApply_1;
}
else if (typeof optionsToApply_1 === 'function') {
// If the option value is function, we'll subscribe this function to the emitter.
this_1[propKey_1].subscribe(function ($event) {
// Call this function/handler.
// Call this function/handler.
optionsToApply_1($event);
});
}
else {
// Do nothing.
}
}
else if (overwrite || typeof this_1[propKey_1] === 'undefined') {
// Else, set this option value into the field.
this_1[propKey_1] = optionsToApply_1;
}
}
}
var e_1, _c;
};
var this_1 = this;
for (var /** @type {?} */ optionKey in this['_options_']) {
_loop_1(optionKey);
}
}
// Call original setOptions()
// Call original setOptions()
originalSetOptions_1.call(this, options);
};
target['_optionsSetOptionsWrapped_'] = true;
}
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uLmRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQUV2RCxNQUFNLGlCQUFpQixHQUFZO0lBRWpDLHFCQUFJLFdBQVcsR0FBVyxTQUFTLENBQUM7O0lBR3BDLE1BQU0sQ0FBQyxVQUFTLE1BQVcsRUFBRSxXQUFnQixFQUFFLFVBQWU7UUFDNUQscUJBQUksT0FBTyxHQUFXLEdBQUcsSUFBSSxXQUFXLENBQUM7UUFDekMscUJBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELHFCQUFJLGdCQUFnQixHQUFHLFVBQVUsQ0FBQztZQUVsQyxFQUFFLENBQUMsQ0FBQyxPQUFPLGdCQUFnQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7O2dCQUV6QyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzthQUMzRDtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLFVBQVUsR0FBRyxFQUFFLENBQUM7YUFDakI7WUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUU7Z0JBQ3pDLEtBQUssRUFBRSxVQUFVO2dCQUNqQixVQUFVLEVBQUUsS0FBSztnQkFDakIs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QUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQ0FBL0IsU0FBUztxQkEwRWpCO2lCQUNGOztnQkFHRCxBQURBLDZCQUE2QjtnQkFDN0Isb0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN4QyxDQUFBO1lBRUQsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQzdDO0tBRUYsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhVXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgQXJyYXlVdGlscyB9IGZyb20gJy4uL3NoYXJlL3V0aWxzL0FycmF5VXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gT3B0aW9uKGtleT86IHN0cmluZyk6IGFueSB7XG5cbiAgbGV0IE9QVElPTlNfS0VZOiBzdHJpbmcgPSBcIm9wdGlvbnNcIjtcblxuICAvLyBhZGQgb3B0aW9uIHRvIF9vcHRpb25zX1xuICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnksIGRlc2NyaXB0b3I6IGFueSkge1xuICAgIGxldCBwcm9wS2V5OiBzdHJpbmcgPSBrZXkgfHwgcHJvcGVydHlLZXk7XG4gICAgbGV0IG9wdGlvbnNNYXAgPSB0YXJnZXRbJ19vcHRpb25zXyddO1xuXG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCAnX29wdGlvbnNfJykpIHtcbiAgICAgIGxldCBwYXJlbnRPcHRpb25zTWFwID0gb3B0aW9uc01hcDtcblxuICAgICAgaWYgKHR5cGVvZiBwYXJlbnRPcHRpb25zTWFwID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBJbmhlcml0IG9wdGlvbnNNYXAgZnJvbSBzdXBlciBjbGFzc1xuICAgICAgICBvcHRpb25zTWFwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJlbnRPcHRpb25zTWFwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zTWFwID0ge307XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICdfb3B0aW9uc18nLCB7XG4gICAgICAgIHZhbHVlOiBvcHRpb25zTWFwLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB7IHByb3BLZXk6IDxjbGFzcy1wcm9wZXJ0eS1rZXk+IH1cbiAgICBvcHRpb25zTWFwW3Byb3BLZXldID0gcHJvcGVydHlLZXk7XG5cbiAgICAvLyBXZSdyZSBnb2luZyB0byB3cmFwIG5nT25Jbml0KCkgdG8gaW50ZXJjZXB0IHRoZSBmdW5jdGlvbiBjYWxsIHRvIGluaXRpYWxpemUgQE9wdGlvbigpIGZpZWxkcyBmaXJzdC5cbiAgICBpZiAodHlwZW9mIHRhcmdldFsnbmdPbkluaXQnXSA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGFyZ2V0Wydfb3B0aW9uc05nT25Jbml0V3JhcHBlZF8nXSkge1xuICAgICAgLy8gS2VlcCBvcmlnaW5hbCBuZ09uSW5pdCgpIGZ1bmN0aW9uIHRvIGNhbGwgaXQgbGF0ZXIuXG4gICAgICBsZXQgb3JpZ2luYWxJbml0ID0gdGFyZ2V0WyduZ09uSW5pdCddO1xuXG4gICAgICAvLyBSZS1pbXBsZW1lbnQgdGhlIG5nT25Jbml0KCkgZnVuY3Rpb24uXG4gICAgICB0YXJnZXRbJ25nT25Jbml0J10gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gV2UndmUgdG8gY2hlY2sgdGhlIGZsYWcgXCJfb3B0aW9uc05nT25Jbml0RXhlY3V0ZWRfXCIgdG8gbWFrZSBzdXJlIHRoYXQgaXQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gICAgICAgIGlmICghdGhpc1snX29wdGlvbnNOZ09uSW5pdEV4ZWN1dGVkXyddKSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGlzLnNldE9wdGlvbnMoKSB0byBhdXRvIHJlc29sdmUgQE9wdGlvbigpIGZpZWxkIHZhbHVlc1xuICAgICAgICAgIC8vIFBhc3Npbmcgb3ZlcndyaXRlID0gZmFsc2UgbWVhbnMgbm90IHRvIGF1dG8gcmVzb2x2ZSB0aGUgZmllbGRzIGhhdmluZyB2YWx1ZSAhPT0gdW5kZWZpbmVkLlxuICAgICAgICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMsIGZhbHNlKTtcblxuICAgICAgICAgIHRoaXNbJ19vcHRpb25zTmdPbkluaXRFeGVjdXRlZF8nXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIG5nT25Jbml0KClcbiAgICAgICAgb3JpZ2luYWxJbml0LmNhbGwodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldFsnX29wdGlvbnNOZ09uSW5pdFdyYXBwZWRfJ10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHdyYXAgc2V0T3B0aW9ucygpIHRvIGludGVyY2VwdCB0aGUgZnVuY3Rpb24gY2FsbCB0byBhdXRvIHJlc29sdmUgQE9wdGlvbigpIGZpZWxkcy5cbiAgICBpZiAodHlwZW9mIHRhcmdldFsnc2V0T3B0aW9ucyddID09PSAnZnVuY3Rpb24nICYmICF0YXJnZXRbJ19vcHRpb25zU2V0T3B0aW9uc1dyYXBwZWRfJ10pIHtcbiAgICAgIC8vIEtlZXAgb3JpZ2luYWwgc2V0T3B0aW9ucygpIGZ1bmN0aW9uIHRvIGNhbGwgaXQgbGF0ZXIuXG4gICAgICBsZXQgb3JpZ2luYWxTZXRPcHRpb25zID0gdGFyZ2V0WydzZXRPcHRpb25zJ107XG5cbiAgICAgIC8vIFJlLWltcGxlbWVudCB0aGUgc2V0T3B0aW9ucygpIGZ1bmN0aW9uLlxuICAgICAgdGFyZ2V0WydzZXRPcHRpb25zJ10gPSBmdW5jdGlvbihvcHRpb25zOiBhbnksIG92ZXJ3cml0ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXNbJ19vcHRpb25zXyddICE9PSBudWxsICYmIHR5cGVvZiB0aGlzWydfb3B0aW9uc18nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBvcHRpb25LZXkgaW4gdGhpc1snX29wdGlvbnNfJ10pIHtcbiAgICAgICAgICAgIGxldCBwcm9wS2V5ID0gdGhpc1snX29wdGlvbnNfJ11bb3B0aW9uS2V5XSB8fCBvcHRpb25LZXk7XG5cbiAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IHRoaXNbcHJvcEtleV07XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBsZXQgb3B0aW9uc1RvQXBwbHk6IGFueSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShvcHRpb25LZXksIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UnbGwgb25seSBvdmVycmlkZSBAT3B0aW9uIGZpZWxkIHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCBpbiBvcHRpb25zIG9iamVjdCBvbmx5LlxuICAgICAgICAgICAgICAgIC8vIFVzZSBEYXRhVXRpbHMuZ2V0RGF0YVZhbHVlKCkgaGVyZSB0byBzdXBwb3J0IGRvdCBub3RhdGlvbiAoLik6IGZvby5iYXJcbiAgICAgICAgICAgICAgICBvcHRpb25zVG9BcHBseSA9IERhdGFVdGlscy5nZXREYXRhVmFsdWUob3B0aW9uS2V5LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5nZXROYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gQXV0byByZXNvbHZlIEBPcHRpb24oKSB2YWx1ZSBmcm9tIHBhcmVudCdzIG9wdGlvbiBvYmplY3QgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgICAgICAvLyB7IGNvbXBOYW1lOiB7Y29tcE9wdGlvbnN9IH1cbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uc0J5TmFtZSA9IG9wdGlvbnNbbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zQnlOYW1lICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zQnlOYW1lID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShvcHRpb25LZXksIG9wdGlvbnNCeU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gV2UnbGwgb25seSBvdmVycmlkZSBAT3B0aW9uIGZpZWxkIHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCBpbiBvcHRpb25zIG9iamVjdCBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBEYXRhVXRpbHMuZ2V0RGF0YVZhbHVlKCkgaGVyZSB0byBzdXBwb3J0IGRvdCBub3RhdGlvbiAoLik6IGZvby5iYXJcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVG9BcHBseSA9IERhdGFVdGlscy5nZXREYXRhVmFsdWUob3B0aW9uS2V5LCBvcHRpb25zQnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zVG9BcHBseSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcEtleV0gIT09IG51bGwgJiYgdGhpc1twcm9wS2V5XSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzW3Byb3BLZXldWydzZXRPcHRpb25zJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXNbcHJvcEtleV0gaXMgSUhhc09wdGlvbnMsIGNoYWluIHRoZSBtZXRob2QgY2FsbCBpbnRvIGl0LlxuICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XS5zZXRPcHRpb25zKG9wdGlvbnNUb0FwcGx5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcEtleV0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheSh0aGlzW3Byb3BLZXldKSAmJiBBcnJheVV0aWxzLmlzQWxsTWVtYmVySGFzUHJvcGVydHlUeXBlT2YodGhpc1twcm9wS2V5XSwgJ3NldE9wdGlvbnMnLCAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpc1twcm9wS2V5XSBpcyBhbiBhcnJheSBvZiBJSGFzT3B0aW9ucywgY2hhaW4gdGhlIG1ldGhvZCBjYWxsIGludG8gaXRzIG1lbWJlci5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zVG9BcHBseSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnNUb0FwcGx5KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBvcHRpb25zVG9BcHBseSBpcyBhbiBhcnJheSwgY2hhaW4gdGhlIG1ldGhvZCBjYWxsIDEtYnktMS5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRoaXNbcHJvcEtleV0ubGVuZ3RoICYmIGlkeCA8IG9wdGlvbnNUb0FwcGx5Lmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgb3B0aW9ucyB2YWx1ZSAxLWJ5LTEuXG4gICAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XVtpZHhdLnNldE9wdGlvbnMob3B0aW9uc1RvQXBwbHlbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGlkeCA8IHRoaXNbcHJvcEtleV0ubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBcIm51bGxcIiBvcHRpb25zIGludG8gYWxsIG1lbWJlcnMgbGVmdC5cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BLZXldW2lkeF0uc2V0T3B0aW9ucyhudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRWxzZSwgY2hhaW4gbWV0aG9kIGNhbGwgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvbiBhbGwgbWVtYmVycy5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbWVtYmVyIG9mIHRoaXNbcHJvcEtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuc2V0T3B0aW9ucyhvcHRpb25zVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzW3Byb3BLZXldICE9PSB1bmRlZmluZWQgJiYgdGhpc1twcm9wS2V5XSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBwcm9wZXJ0eSBpcyBFdmVudEVtaXR0ZXIsIGl0IG1pZ2h0IGJlIG5nIEBPdXRwdXQuXG4gICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1RvQXBwbHkgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIgJiYgb3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvcHRpb24gdmFsdWUgaXMgRXZlbnRFbWl0dGVyIGFsc28uXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIG92ZXJ3cml0ZSB0aGUgdmFsdWUgb25seSBpZiBcIm92ZXJ3cml0ZVwiIGlzIHNldC5cbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XSA9IG9wdGlvbnNUb0FwcGx5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9uc1RvQXBwbHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBmdW5jdGlvbiwgd2UnbGwgc3Vic2NyaWJlIHRoaXMgZnVuY3Rpb24gdG8gdGhlIGVtaXR0ZXIuXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcEtleV0uc3Vic2NyaWJlKCgkZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbi9oYW5kbGVyLlxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUb0FwcGx5KCRldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG92ZXJ3cml0ZSB8fCB0eXBlb2YgdGhpc1twcm9wS2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVsc2UsIHNldCB0aGlzIG9wdGlvbiB2YWx1ZSBpbnRvIHRoZSBmaWVsZC5cbiAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcEtleV0gPSBvcHRpb25zVG9BcHBseTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIHNldE9wdGlvbnMoKVxuICAgICAgICBvcmlnaW5hbFNldE9wdGlvbnMuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0Wydfb3B0aW9uc1NldE9wdGlvbnNXcmFwcGVkXyddID0gdHJ1ZTtcbiAgICB9XG5cbiAgfTtcbn1cbiJdfQ==