ngx-manage
Version:
- angular class descriptor and state
352 lines • 21.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Subject } from 'rxjs';
import 'reflect-metadata';
/** @type {?} */
const Injector = new class {
constructor() {
this.hash = {};
}
// resolving instances
/**
* @template T
* @param {?} target
* @return {?}
*/
resolveHash(target) {
if (this.hash[target.name]) {
return this.hash[target.name];
}
// tokens are required dependencies, while injections are resolved tokens from the Injector
/** @type {?} */
let tokens = Reflect.getMetadata('design:paramtypes', target) || [];
/** @type {?} */
let injections = tokens.map((/**
* @param {?} token
* @return {?}
*/
token => Injector.resolve(token)));
this.hash[target.name] = new target(...injections);
return this.hash[target.name];
}
/**
* @template T
* @param {?} target
* @return {?}
*/
resolve(target) {
// tokens are required dependencies, while injections are resolved tokens from the Injector
/** @type {?} */
let tokens = Reflect.getMetadata('design:paramtypes', target) || [];
/** @type {?} */
let injections = tokens.map((/**
* @param {?} token
* @return {?}
*/
token => Injector.resolve(token)));
return new target(...injections);
}
};
export class StateMessage {
/**
* @param {?} name
* @param {?} state
* @param {?} msg
*/
constructor(name, state, msg) {
this.name = name;
this.state = state;
this.msg = msg;
}
}
if (false) {
/** @type {?} */
StateMessage.prototype.name;
/** @type {?} */
StateMessage.prototype.state;
/** @type {?} */
StateMessage.prototype.msg;
}
/**
* @record
*/
function IStateMessageService() { }
if (false) {
/**
* @param {?} name
* @param {?} message
* @param {?} state
* @return {?}
*/
IStateMessageService.prototype.SendMessage = function (name, message, state) { };
}
export class StateMessageService {
/**
* @param {?} name
* @param {?} message
* @param {?} state
* @return {?}
*/
SendMessage(name, message, state) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
var msg = {};
state.sendMessage(name, msg);
return;
});
}
}
/**
* @record
*/
export function IStateService() { }
if (false) {
/**
* @param {?} name
* @param {?} cb
* @return {?}
*/
IStateService.prototype.getState = function (name, cb) { };
/**
* @param {?} name
* @param {?} message
* @return {?}
*/
IStateService.prototype.sendMessage = function (name, message) { };
/**
* @param {?} set
* @return {?}
*/
IStateService.prototype.getStates = function (set) { };
/**
* @param {?} name
* @param {?} id
* @return {?}
*/
IStateService.prototype.read = function (name, id) { };
/**
* @param {?} name
* @param {?} id
* @param {?} data
* @param {?} cache
* @return {?}
*/
IStateService.prototype.write = function (name, id, data, cache) { };
}
class StateService {
constructor() {
this.version = '1.0.2';
this.subjects = {};
this.state = {};
}
/**
* @private
* @param {?} name
* @return {?}
*/
init(name) {
if (!this.subjects[name]) {
this.state = {};
this.subjects[name] = new Subject();
}
return this.subjects[name];
}
/**
* @param {?} name
* @param {?} cb
* @return {?}
*/
getState(name, cb) {
return this.init(name).asObservable().subscribe((/**
* @param {?} msg
* @return {?}
*/
(msg) => cb(msg)));
}
/**
* @param {?} set
* @return {?}
*/
getStates(set) {
/** @type {?} */
var subscribtion = [];
for (var s in set) {
subscribtion.push(this.init(s).asObservable().subscribe((/**
* @param {?} msg
* @return {?}
*/
(msg) => {
/** @type {?} */
const fn = set[msg.name] || set[s];
fn(msg);
})));
}
return subscribtion;
}
/**
* @param {?} name
* @param {?} message
* @return {?}
*/
sendMessage(name, message) {
/** @type {?} */
var a = this.init(name);
a.next({ msg: message, name: name });
}
/**
* @param {?} name
* @param {?} id
* @return {?}
*/
read(name, id) {
/** @type {?} */
const d = this.state[name] || {};
/** @type {?} */
const i = d[id];
if (i)
return i;
/** @type {?} */
var data = localStorage.getItem(this.version + '_' + name + '_' + id);
/** @type {?} */
var cacheData = JSON.parse(data);
if (cacheData) {
this.state[name] = this.state[name] || {};
this.state[name][id] = cacheData;
this.write(name, id, cacheData, true);
return this.state[name][id];
}
}
/**
* @param {?} name
* @param {?} id
* @param {?} data
* @param {?=} cache
* @return {?}
*/
write(name, id, data, cache = false) {
if (!this.state[name])
this.state[name] = {};
if (this.state[name]) {
this.state[name][id] = data;
}
if (!cache) {
/** @type {?} */
var c = JSON.stringify(data);
localStorage.setItem(this.version + '_' + name + '_' + id, c);
}
}
}
if (false) {
/**
* @type {?}
* @private
*/
StateService.prototype.version;
/**
* @type {?}
* @private
*/
StateService.prototype.subjects;
/**
* @type {?}
* @private
*/
StateService.prototype.state;
}
/**
* @param {?} config
* @return {?}
*/
export function StateDecorator(config) {
return (/**
* @template T
* @param {?} constr
* @return {?}
*/
function _DecoratorName(constr) {
/** @type {?} */
var service;
/** @type {?} */
var state = Injector.resolveHash(StateService);
if (config.service) {
/** @type {?} */
var i = config.service;
if (i.static)
service = Injector.resolveHash(i.def);
else
service = Injector.resolve(i.def);
}
return class extends constr {
constructor() {
super(...arguments);
this.message = service;
this.subscribtion = [];
}
/**
* @param {?} set
* @return {?}
*/
getStates(set) {
this.subscribtion = state.getStates(set);
}
/**
* @param {?} name
* @param {?} cb
* @return {?}
*/
getState(name, cb) {
this.subscribtion.push(state.getState(name, cb));
}
/**
* @param {?} name
* @param {?} message
* @return {?}
*/
sendMessage(name, message) {
if (this.message) {
this.message.SendMessage(name, message, state);
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscribtion.forEach((/**
* @param {?} e
* @return {?}
*/
(e) => e.unsubscribe()));
}
};
});
}
export class StateBase {
constructor() { }
/**
* @param {?} name
* @param {?} cb
* @return {?}
*/
getState(name, cb) { }
;
/**
* @param {?} name
* @param {?} message
* @return {?}
*/
sendMessage(name, message) { }
/**
* @return {?}
*/
ngOnDestroy() { }
/**
* @param {?} set
* @return {?}
*/
getStates(set) { }
;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYW5hZ2UvIiwic291cmNlcyI6WyJsaWIvYmFzZS9zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFHLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoQyxPQUFPLGtCQUFrQixDQUFBOztNQUduQixRQUFRLEdBQUcsSUFBSTtJQUFBO1FBQ25CLFNBQUksR0FBTyxFQUFFLENBQUM7SUFtQmhCLENBQUM7Ozs7Ozs7SUFqQkMsV0FBVyxDQUFJLE1BQWlCO1FBQzlCLElBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQ3pCO1lBQ0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQjs7O1lBRUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRTs7WUFDL0QsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFNLEtBQUssQ0FBQyxFQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDOzs7Ozs7SUFDRCxPQUFPLENBQUksTUFBaUI7OztZQUV0QixNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFOztZQUMvRCxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUc7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFP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LENBQUMsQ0FBQztpQkFDOUM7WUFDSCxDQUFDOzs7O1lBQ0QsV0FBVztnQkFFVCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87Ozs7Z0JBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBQyxDQUFDO1lBQ2xELENBQUM7U0FDRixDQUFBO0lBQ0gsQ0FBQyxFQUFBO0FBQ0gsQ0FBQztBQUdELE1BQU0sT0FBTyxTQUFTO0lBQ3BCLGdCQUFnQixDQUFDOzs7Ozs7SUFDakIsUUFBUSxDQUFDLElBQVcsRUFBQyxFQUFXLElBQUUsQ0FBQztJQUFBLENBQUM7Ozs7OztJQUNwQyxXQUFXLENBQUMsSUFBVyxFQUFDLE9BQVksSUFBRSxDQUFDOzs7O0lBQ3ZDLFdBQVcsS0FBRyxDQUFDOzs7OztJQUNmLFNBQVMsQ0FBQyxHQUFHLElBQUUsQ0FBQztJQUFBLENBQUM7Q0FDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyAgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJ1xuaW1wb3J0IHsgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmNvbnN0IEluamVjdG9yID0gbmV3IGNsYXNzIHtcbiAgaGFzaDphbnkgPSB7fTtcbiAgLy8gcmVzb2x2aW5nIGluc3RhbmNlc1xuICByZXNvbHZlSGFzaDxUPih0YXJnZXQ6IFR5cGU8YW55Pik6IFQge1xuICAgIGlmKHRoaXMuaGFzaFt0YXJnZXQubmFtZV0pXG4gICAge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzaFt0YXJnZXQubmFtZV07XG4gICAgfVxuICAgIC8vIHRva2VucyBhcmUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzLCB3aGlsZSBpbmplY3Rpb25zIGFyZSByZXNvbHZlZCB0b2tlbnMgZnJvbSB0aGUgSW5qZWN0b3JcbiAgICBsZXQgdG9rZW5zID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgnZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQpIHx8IFtdLFxuICAgICAgICBpbmplY3Rpb25zID0gdG9rZW5zLm1hcCh0b2tlbiA9PiBJbmplY3Rvci5yZXNvbHZlPGFueT4odG9rZW4pKTtcbiAgICB0aGlzLmhhc2hbdGFyZ2V0Lm5hbWVdID0gbmV3IHRhcmdldCguLi5pbmplY3Rpb25zKTtcbiAgICByZXR1cm4gdGhpcy5oYXNoW3RhcmdldC5uYW1lXTtcbiAgfVxuICByZXNvbHZlPFQ+KHRhcmdldDogVHlwZTxhbnk+KTogVCB7XG4gICAgLy8gdG9rZW5zIGFyZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMsIHdoaWxlIGluamVjdGlvbnMgYXJlIHJlc29sdmVkIHRva2VucyBmcm9tIHRoZSBJbmplY3RvclxuICAgIGxldCB0b2tlbnMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCkgfHwgW10sXG4gICAgICAgIGluamVjdGlvbnMgPSB0b2tlbnMubWFwKHRva2VuID0+IEluamVjdG9yLnJlc29sdmU8YW55Pih0b2tlbikpO1xuICAgIHJldHVybiBuZXcgdGFyZ2V0KC4uLmluamVjdGlvbnMpO1xuICB9XG59O1xuXG5cbmV4cG9ydCBjbGFzcyBTdGF0ZU1lc3NhZ2VcbntcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6c3RyaW5nLFxuICAgIHB1YmxpYyBzdGF0ZTphbnksXG4gICAgcHVibGljIG1zZzphbnlcbiAgKXt9XG59XG5pbnRlcmZhY2UgSVN0YXRlTWVzc2FnZVNlcnZpY2VcbntcbiAgU2VuZE1lc3NhZ2UobmFtZTpzdHJpbmcsbWVzc2FnZTogYW55LHN0YXRlOklTdGF0ZVNlcnZpY2UpOlByb21pc2U8YW55Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YXRlTWVzc2FnZVNlcnZpY2UgaW1wbGVtZW50cyBJU3RhdGVNZXNzYWdlU2VydmljZVxue1xuICBhc3luYyBTZW5kTWVzc2FnZShuYW1lOnN0cmluZyxtZXNzYWdlOiBhbnksc3RhdGU6SVN0YXRlU2VydmljZSk6UHJvbWlzZTxhbnk+XG4gIHtcbiAgICB2YXIgbXNnID0ge307XG4gICAgc3RhdGUuc2VuZE1lc3NhZ2UobmFtZSxtc2cpO1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdGF0ZVNlcnZpY2VcbntcbiAgZ2V0U3RhdGUobmFtZTpzdHJpbmcsY2I6RnVuY3Rpb24pOy8vOk9ic2VydmFibGU8YW55PlxuICBzZW5kTWVzc2FnZShuYW1lOnN0cmluZyxtZXNzYWdlOiBhbnkpO1xuICBnZXRTdGF0ZXMoc2V0KTtcbiAgcmVhZChuYW1lOnN0cmluZyxpZDpudW1iZXIpOmFueTtcbiAgd3JpdGUobmFtZTpzdHJpbmcsaWQ6bnVtYmVyLGRhdGE6YW55LGNhY2hlOkJvb2xlYW4pO1xufVxuXG5jbGFzcyBTdGF0ZVNlcnZpY2UgaW1wbGVtZW50cyBJU3RhdGVTZXJ2aWNlXG57XG4gIHByaXZhdGUgdmVyc2lvbjpzdHJpbmcgID0gJzEuMC4yJztcbiAgcHJpdmF0ZSBzdWJqZWN0cyA9IHt9O1xuICBwcml2YXRlIHN0YXRlID0ge307XG4gIGNvbnN0cnVjdG9yKClcbiAge1xuICB9XG4gIHByaXZhdGUgaW5pdChuYW1lOnN0cmluZyk6U3ViamVjdDxhbnk+XG4gIHtcbiAgICBpZighdGhpcy5zdWJqZWN0c1tuYW1lXSlcbiAgICB7XG4gICAgICB0aGlzLnN0YXRlID0ge307XG4gICAgICB0aGlzLnN1YmplY3RzW25hbWVdID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0c1tuYW1lXTtcbiAgfVxuICBnZXRTdGF0ZShuYW1lOnN0cmluZyxjYjpGdW5jdGlvbil7XG4gICAgcmV0dXJuIHRoaXMuaW5pdChuYW1lKS5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKG1zZyk9PmNiKG1zZykpO1xuICB9XG4gIGdldFN0YXRlcyhzZXQpe1xuICAgIHZhciBzdWJzY3JpYnRpb246YW55W10gPSBbXTtcbiAgICBmb3IodmFyIHMgaW4gIHNldClcbiAgICB7XG4gICAgICBzdWJzY3JpYnRpb24ucHVzaChcbiAgICAgICAgdGhpcy5pbml0KHMpLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgobXNnKT0+e1xuICAgICAgICAgIGNvbnN0IGZuID0gc2V0W21zZy5uYW1lXSB8fCBzZXRbc107XG4gICAgICAgICAgZm4obXNnKVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnNjcmlidGlvbjtcbiAgfVxuICBzZW5kTWVzc2FnZShuYW1lOnN0cmluZyxtZXNzYWdlOiBhbnkpe1xuICAgIHZhciBhID0gdGhpcy5pbml0KG5hbWUpO1xuICAgIGEubmV4dCh7IG1zZyA6IG1lc3NhZ2UsbmFtZTpuYW1lIH0pO1xuICB9ICBcbiAgcmVhZChuYW1lOnN0cmluZyxpZDpudW1iZXIpOmFueVxuICB7XG4gICAgY29uc3QgZCA9IHRoaXMuc3RhdGVbbmFtZV0gfHwge307XG4gICAgY29uc3QgaSA9IGRbaWRdO1xuICAgIGlmKGkpIHJldHVybiBpO1xuXG4gICAgdmFyIGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnZlcnNpb24rJ18nK25hbWUrJ18nK2lkKTtcbiAgICB2YXIgY2FjaGVEYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICBpZihjYWNoZURhdGEpXG4gICAge1xuICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IHRoaXMuc3RhdGVbbmFtZV0gfHwge307XG4gICAgICB0aGlzLnN0YXRlW25hbWVdW2lkXSA9IGNhY2hlRGF0YTtcbiAgICAgIHRoaXMud3JpdGUobmFtZSxpZCxjYWNoZURhdGEsdHJ1ZSk7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZVtuYW1lXVtpZF07XG4gICAgfVxuICB9XG4gIHdyaXRlKG5hbWU6c3RyaW5nLGlkOm51bWJlcixkYXRhOmFueSxjYWNoZTpCb29sZWFuID0gZmFsc2UpXG4gIHtcbiAgICBpZighdGhpcy5zdGF0ZVtuYW1lXSkgdGhpcy5zdGF0ZVtuYW1lXSA9IHt9O1xuICAgIGlmKHRoaXMuc3RhdGVbbmFtZV0pXG4gICAge1xuICAgICAgdGhpcy5zdGF0ZVtuYW1lXVtpZF0gPSBkYXRhO1xuICAgIH1cbiAgICBpZighY2FjaGUpXG4gICAge1xuICAgICAgdmFyIGMgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMudmVyc2lvbisnXycrbmFtZSsnXycraWQsIGMpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gU3RhdGVEZWNvcmF0b3IoY29uZmlnOmFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gX0RlY29yYXRvck5hbWU8VCBleHRlbmRzIHtuZXcoLi4uYXJnczogYW55W10pOiB7fX0+KGNvbnN0cjogVCl7XG4gICAgdmFyIHNlcnZpY2U6SVN0YXRlTWVzc2FnZVNlcnZpY2U7XG4gICAgdmFyIHN0YXRlIDogU3RhdGVTZXJ2aWNlID0gSW5qZWN0b3IucmVzb2x2ZUhhc2g8U3RhdGVTZXJ2aWNlPihTdGF0ZVNlcnZpY2UpO1xuICAgIGlmKGNvbmZpZy5zZXJ2aWNlKVxuICAgIHtcbiAgICAgIHZhciBpID0gY29uZmlnLnNlcnZpY2U7XG4gICAgICBpZihpLnN0YXRpYylcbiAgICAgICAgc2VydmljZSA9IEluamVjdG9yLnJlc29sdmVIYXNoPHR5cGVvZiBpLmRlZj4oaS5kZWYpO1xuICAgICAgZWxzZVxuICAgICAgICBzZXJ2aWNlID0gSW5qZWN0b3IucmVzb2x2ZTx0eXBlb2YgaS5kZWY+KGkuZGVmKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgY29uc3RyIHtcbiAgICAgIG1lc3NhZ2U6SVN0YXRlTWVzc2FnZVNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgc3Vic2NyaWJ0aW9uOmFueVtdID0gW107XG4gICAgICBnZXRTdGF0ZXMoc2V0KVxuICAgICAge1xuICAgICAgICB0aGlzLnN1YnNjcmlidGlvbiA9IHN0YXRlLmdldFN0YXRlcyhzZXQpO1xuICAgICAgfVxuICAgICAgZ2V0U3RhdGUobmFtZTpzdHJpbmcsY2I6RnVuY3Rpb24pXG4gICAgICB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9uLnB1c2goc3RhdGUuZ2V0U3RhdGUobmFtZSxjYikpO1xuICAgICAgfVxuICAgICAgc2VuZE1lc3NhZ2UobmFtZTpzdHJpbmcsbWVzc2FnZTogYW55KXtcbiAgICAgICAgaWYodGhpcy5tZXNzYWdlKVxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlLlNlbmRNZXNzYWdlKG5hbWUsbWVzc2FnZSxzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5nT25EZXN0cm95KClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb24uZm9yRWFjaCgoZSk9PmUudW5zdWJzY3JpYmUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IGNsYXNzIFN0YXRlQmFzZSBpbXBsZW1lbnRzIE9uRGVzdHJveXtcbiAgY29uc3RydWN0b3IoKSB7IH1cbiAgZ2V0U3RhdGUobmFtZTpzdHJpbmcsY2I6RnVuY3Rpb24pe307XG4gIHNlbmRNZXNzYWdlKG5hbWU6c3RyaW5nLG1lc3NhZ2U6IGFueSl7fVxuICBuZ09uRGVzdHJveSgpe31cbiAgZ2V0U3RhdGVzKHNldCl7fTtcbn1cbiJdfQ==