ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
200 lines • 19.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { BelongsToMetadata } from './symboles';
import { ResourceBase } from '../resource-base.model';
import { TypesStore } from '../types-store';
/**
* @param {?=} options
* @return {?}
*/
export function BelongsTo(options = {}) {
return (/**
* @param {?} target
* @param {?} propertyName
* @return {?}
*/
(target, propertyName) => {
/** @type {?} */
const setupMetadata = (/**
* @return {?}
*/
() => {
/** @type {?} */
const belongsTos = Reflect.getMetadata(BelongsToMetadata, target) || [];
belongsTos.push({
propertyName,
backendName: options.backendName || propertyName,
readonly: !!options.readonly,
sidepostable: !!options.sidepostable,
});
Reflect.defineMetadata(BelongsToMetadata, belongsTos, target);
});
/** @type {?} */
const getClass = (/**
* @param {?=} fromVal
* @return {?}
*/
(fromVal) => {
// const klass = options.class();
if (!Array.isArray(options.class)) {
return TypesStore.find(options.class);
}
/** @type {?} */
const klasses = options.class.map((/**
* @param {?} klass
* @return {?}
*/
klass => TypesStore.find(klass)));
if (!fromVal) {
return klasses[0];
}
/** @type {?} */
const type = fromVal.type;
if (!type) {
throw new Error('Object should be a subclass of ResourceBase or should have a type attribute!');
}
/** @type {?} */
const prop = klasses.find((/**
* @param {?} k
* @return {?}
*/
k => {
/** @type {?} */
const obj = new k();
return obj.type === type;
}));
if (!prop) {
throw new Error('Object should be a subclass of ResourceBase or should have a type attribute!');
}
return prop;
});
/** @type {?} */
const updateSideload = (/**
* @param {?} propClass
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
(propClass, oldValue, newValue) => {
/** @type {?} */
const noOldId = !(oldValue && oldValue.id);
/** @type {?} */
const noNewId = !(newValue && newValue.id);
/** @type {?} */
const noIds = noOldId && noNewId;
/** @type {?} */
const eqIds = noOldId || noNewId ? false : oldValue.id === newValue.id;
// no ids: can't create a resource. This is a sideload!
if (noIds) {
return null;
}
// new don't exist: disassociate old from the resource
if (noNewId || newValue.deleteRelation) {
oldValue.disassociate();
return oldValue;
}
// same ids: can't update a resource. This is a sideload!
if (eqIds) {
/** @type {?} */
const type1 = oldValue.type;
/** @type {?} */
const type2 = newValue.type;
if (!type2 || type1 === type2) {
return oldValue;
}
}
// no old or different IDs: create new relationship
return ResourceBase.getAsRelationship(propClass, newValue, { method: 'update' });
});
/** @type {?} */
const updateSidepost = (/**
* @param {?} propClass
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
(propClass, oldValue, newValue) => {
/** @type {?} */
const oldHaveId = !!(oldValue && oldValue.id);
/** @type {?} */
const newHaveId = !!(newValue && newValue.id);
/** @type {?} */
const newHaveVal = !!(newValue && Object.keys(newValue).filter((/**
* @param {?} key
* @return {?}
*/
key => key !== 'id' && key !== 'type')).length > 0);
/** @type {?} */
const eqIds = oldHaveId && newHaveId ? oldValue.id === newValue.id : false;
// equal ids: update old
if (eqIds) {
if (newValue.deleteRelation) {
oldValue.disassociate();
}
if (newValue.destroyRelation) {
oldValue.destroy();
}
oldValue.assign(newValue);
return oldValue;
}
// new have an id: change old by new
if (newHaveId) {
return ResourceBase.getAsRelationship(propClass, newValue, { method: 'update' });
}
// new don't have id but have value: create new
if (newHaveVal) {
return ResourceBase.getAsRelationship(propClass, newValue, { method: 'create' });
}
// new empty and old null: return null;
if (!oldValue) {
return null;
}
// new empty: disassociate old from the resource
oldValue.disassociate();
return oldValue;
});
/** @type {?} */
const getter = (/**
* @return {?}
*/
function () {
if (!this[`_${propertyName}`] && !this.modelSerialization) {
/** @type {?} */
const propClass = getClass();
this[`_${propertyName}`] = ResourceBase.getAsRelationship(propClass, (/** @type {?} */ ({})));
}
return this[`_${propertyName}`];
});
/** @type {?} */
const setter = (/**
* @param {?} newVal
* @return {?}
*/
function (newVal) {
/** @type {?} */
const propClass = getClass(newVal);
if (this.isModelInitialization()) {
this[`_${propertyName}`] = ResourceBase.getAsRelationship(propClass, newVal, { modelInit: true });
}
else {
/** @type {?} */
const oldVal = this[`_${propertyName}`];
this[`_${propertyName}`] = options.sidepostable ?
updateSidepost(propClass, oldVal, newVal) :
updateSideload(propClass, oldVal, newVal);
}
});
if (delete target[propertyName]) {
setupMetadata();
Object.defineProperty(target, propertyName, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVsb25ncy10by5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvZGVjb3JhdG9ycy9iZWxvbmdzLXRvLmRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRzVDLE1BQU0sVUFBVSxTQUFTLENBQUMsVUFBd0MsRUFBRTtJQUNoRTs7Ozs7SUFBTyxDQUFDLE1BQVcsRUFBRSxZQUFvQixFQUFFLEVBQUU7O2NBRXJDLGFBQWE7OztRQUFHLEdBQUcsRUFBRTs7a0JBQ25CLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFFdkUsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDZCxZQUFZO2dCQUNaLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLFlBQVk7Z0JBQ2hELFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVE7Z0JBQzVCLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVk7YUFDckMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFBOztjQUVLLFFBQVE7Ozs7UUFBRyxDQUFDLE9BQWEsRUFBRSxFQUFFO1lBQ2pDLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7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UUFDbEMsQ0FBQyxDQUFBOztjQUVLLE1BQU07Ozs7UUFBRyxVQUFTLE1BQVc7O2tCQUMzQixTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBTSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7YUFDdEc7aUJBQU07O3NCQUNDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RCLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzNDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMvQixhQUFhLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUU7Z0JBQzFDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNO2dCQUNYLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsRUFBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbnNoaXBEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9vcHRpb24uaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBCZWxvbmdzVG9NZXRhZGF0YSB9IGZyb20gJy4vc3ltYm9sZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VCYXNlIH0gZnJvbSAnLi4vcmVzb3VyY2UtYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBUeXBlc1N0b3JlIH0gZnJvbSAnLi4vdHlwZXMtc3RvcmUnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBCZWxvbmdzVG8ob3B0aW9uczogUmVsYXRpb25zaGlwRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblxuICAgICAgY29uc3Qgc2V0dXBNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYmVsb25nc1RvcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoQmVsb25nc1RvTWV0YWRhdGEsIHRhcmdldCkgfHwgW107XG5cbiAgICAgICAgYmVsb25nc1Rvcy5wdXNoKHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgYmFja2VuZE5hbWU6IG9wdGlvbnMuYmFja2VuZE5hbWUgfHwgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHJlYWRvbmx5OiAhIW9wdGlvbnMucmVhZG9ubHksXG4gICAgICAgICAgc2lkZXBvc3RhYmxlOiAhIW9wdGlvbnMuc2lkZXBvc3RhYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKEJlbG9uZ3NUb01ldGFkYXRhLCBiZWxvbmdzVG9zLCB0YXJnZXQpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0Q2xhc3MgPSAoZnJvbVZhbD86IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zdCBrbGFzcyA9IG9wdGlvbnMuY2xhc3MoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuY2xhc3MpKSB7XG4gICAgICAgICAgcmV0dXJuIFR5cGVzU3RvcmUuZmluZChvcHRpb25zLmNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrbGFzc2VzID0gb3B0aW9ucy5jbGFzcy5tYXAoa2xhc3MgPT4gVHlwZXNTdG9yZS5maW5kKGtsYXNzKSk7XG5cbiAgICAgICAgaWYgKCFmcm9tVmFsKSB7IHJldHVybiBrbGFzc2VzWzBdOyB9XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmcm9tVmFsLnR5cGU7XG4gICAgICAgIGlmICghdHlwZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdCBzaG91bGQgYmUgYSBzdWJjbGFzcyBvZiBSZXNvdXJjZUJhc2Ugb3Igc2hvdWxkIGhhdmUgYSB0eXBlIGF0dHJpYnV0ZSEnKTsgfVxuXG4gICAgICAgIGNvbnN0IHByb3AgPSBrbGFzc2VzLmZpbmQoayA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqID0gbmV3IGsoKTtcbiAgICAgICAgICByZXR1cm4gb2JqLnR5cGUgPT09IHR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3ApIHsgdGhyb3cgbmV3IEVycm9yKCdPYmplY3Qgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgUmVzb3VyY2VCYXNlIG9yIHNob3VsZCBoYXZlIGEgdHlwZSBhdHRyaWJ1dGUhJyk7IH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVTaWRlbG9hZCA9IChwcm9wQ2xhc3M6IGFueSwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBub09sZElkID0gIShvbGRWYWx1ZSAmJiBvbGRWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5vTmV3SWQgPSAhKG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlkKTtcbiAgICAgICAgY29uc3Qgbm9JZHMgPSBub09sZElkICYmIG5vTmV3SWQ7XG4gICAgICAgIGNvbnN0IGVxSWRzID0gbm9PbGRJZCB8fCBub05ld0lkID8gZmFsc2UgOiBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQ7XG5cbiAgICAgICAgLy8gbm8gaWRzOiBjYW4ndCBjcmVhdGUgYSByZXNvdXJjZS4gVGhpcyBpcyBhIHNpZGVsb2FkIVxuICAgICAgICBpZiAobm9JZHMpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgLy8gbmV3IGRvbid0IGV4aXN0OiBkaXNhc3NvY2lhdGUgb2xkIGZyb20gdGhlIHJlc291cmNlXG4gICAgICAgIGlmIChub05ld0lkIHx8IG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyByZXR1cm4gb2xkVmFsdWU7IH1cbiAgICAgICAgLy8gc2FtZSBpZHM6IGNhbid0IHVwZGF0ZSBhIHJlc291cmNlLiBUaGlzIGlzIGEgc2lkZWxvYWQhXG4gICAgICAgIGlmIChlcUlkcykge1xuICAgICAgICAgIGNvbnN0IHR5cGUxID0gb2xkVmFsdWUudHlwZTtcbiAgICAgICAgICBjb25zdCB0eXBlMiA9IG5ld1ZhbHVlLnR5cGU7XG4gICAgICAgICAgaWYgKCF0eXBlMiB8fCB0eXBlMSA9PT0gdHlwZTIpIHsgcmV0dXJuIG9sZFZhbHVlOyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gb2xkIG9yIGRpZmZlcmVudCBJRHM6IGNyZWF0ZSBuZXcgcmVsYXRpb25zaGlwXG4gICAgICAgIHJldHVybiBSZXNvdXJjZUJhc2UuZ2V0QXNSZWxhdGlvbnNoaXA8YW55Pihwcm9wQ2xhc3MsIG5ld1ZhbHVlLCB7bWV0aG9kOiAndXBkYXRlJ30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdXBkYXRlU2lkZXBvc3QgPSAocHJvcENsYXNzOiBhbnksIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkSGF2ZUlkID0gISEob2xkVmFsdWUgJiYgb2xkVmFsdWUuaWQpO1xuICAgICAgICBjb25zdCBuZXdIYXZlSWQgPSAhIShuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5ld0hhdmVWYWwgPSAhIShuZXdWYWx1ZSAmJiBPYmplY3Qua2V5cyhuZXdWYWx1ZSkuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdpZCcgJiYga2V5ICE9PSAndHlwZScpLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBlcUlkcyA9IG9sZEhhdmVJZCAmJiBuZXdIYXZlSWQgPyBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQgOiBmYWxzZTtcblxuICAgICAgICAvLyBlcXVhbCBpZHM6IHVwZGF0ZSBvbGRcbiAgICAgICAgaWYgKGVxSWRzKSB7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyB9XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlc3Ryb3lSZWxhdGlvbikgeyBvbGRWYWx1ZS5kZXN0cm95KCk7IH1cbiAgICAgICAgICBvbGRWYWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuZXcgaGF2ZSBhbiBpZDogY2hhbmdlIG9sZCBieSBuZXdcbiAgICAgICAgaWYgKG5ld0hhdmVJZCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ3VwZGF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZG9uJ3QgaGF2ZSBpZCBidXQgaGF2ZSB2YWx1ZTogY3JlYXRlIG5ld1xuICAgICAgICBpZiAobmV3SGF2ZVZhbCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ2NyZWF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZW1wdHkgYW5kIG9sZCBudWxsOiByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFvbGRWYWx1ZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICAvLyBuZXcgZW1wdHk6IGRpc2Fzc29jaWF0ZSBvbGQgZnJvbSB0aGUgcmVzb3VyY2VcbiAgICAgICAgb2xkVmFsdWUuZGlzYXNzb2NpYXRlKCk7XG4gICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSAmJiAhdGhpcy5tb2RlbFNlcmlhbGl6YXRpb24pIHtcbiAgICAgICAgICBjb25zdCBwcm9wQ2xhc3MgPSBnZXRDbGFzcygpO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywge30gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2V0dGVyID0gZnVuY3Rpb24obmV3VmFsOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcHJvcENsYXNzID0gZ2V0Q2xhc3MobmV3VmFsKTtcblxuICAgICAgICBpZiAodGhpcy5pc01vZGVsSW5pdGlhbGl6YXRpb24oKSkge1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywgbmV3VmFsLCB7bW9kZWxJbml0OiB0cnVlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsID0gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IG9wdGlvbnMuc2lkZXBvc3RhYmxlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaWRlcG9zdChwcm9wQ2xhc3MsIG9sZFZhbCwgbmV3VmFsKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2lkZWxvYWQocHJvcENsYXNzLCBvbGRWYWwsIG5ld1ZhbCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChkZWxldGUgdGFyZ2V0W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgc2V0dXBNZXRhZGF0YSgpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgICAgICBnZXQ6IGdldHRlcixcbiAgICAgICAgICBzZXQ6IHNldHRlcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4iXX0=