angular-odata
Version:
Client side OData typescript library for Angular
220 lines • 25.8 kB
JavaScript
import { ODataParserSchemaElement } from './element';
import { ODataStructuredTypeParser, } from './parsers';
export class ODataStructuredType extends ODataParserSchemaElement {
base;
parent;
children = [];
model;
collection;
constructor(config, schema) {
super(config, schema, new ODataStructuredTypeParser(config, schema.namespace, schema.alias));
this.base = config.base;
this.model = config.model;
this.collection = config.collection;
}
configure({ options }) {
if (this.base) {
const parent = this.api.findStructuredType(this.base);
parent.children.push(this);
this.parent = parent;
}
this.parser.configure({
options,
parserForType: (t) => this.api.parserForType(t),
});
if (this.model !== undefined) {
this.model.meta = this.api.optionsForType(this.type(), {
config: this.model.options,
structuredType: this,
});
if (this.model.meta !== undefined) {
// Configure
this.model.meta.configure({ options });
}
if (this.collection !== undefined) {
this.collection.model = this.model;
}
}
}
/**
* Returns a boolean indicating if the structured type is a subtype of the given type.
* @param type String representation of the type
* @returns True if the callable is type of the given type
*/
isSubtypeOf(schema) {
return (super.isSubtypeOf(schema) ||
(this.parent !== undefined && this.parent.isSubtypeOf(schema)));
}
/**
* Returns a boolean indicating if the structured type is a supertype of the given type.
* @param type String representation of the type
* @returns True if the callable is type of the given type
*/
isSupertypeOf(schema) {
return (super.isSupertypeOf(schema) ||
this.children.some((c) => c.isSupertypeOf(schema)));
}
/**
* Returns a boolean indicating if the structured type has a simple key.
* @returns True if the structured type has a simple key
*/
isSimpleKey() {
return this.keys().length === 1;
}
/**
* Returns a boolean indicating if the structured type has a compound key.
* @returns True if the structured type has a compound key.
*/
isCompoundKey() {
return this.keys().length > 1;
}
isOpenType() {
return this.parser.isOpenType();
}
isEntityType() {
return this.parser.isEntityType();
}
isComplexType() {
return this.parser.isComplexType();
}
/**
* Find the field parser for the given field name.
* @param name Name of the field
* @returns The field parser
*/
field(name) {
return this.parser.field(name);
}
addField(name, config) {
return this.parser.addField(name, config);
}
/**
* Find a parent schema of the structured type.
* @param predicate Function for evaluate the schemas in the hierarchy.
* @returns The schema that matches the predicate.
*/
findParentSchema(predicate) {
if (predicate(this))
return this;
if (this.parent === undefined)
return undefined;
return this.parent.findParentSchema(predicate);
}
findChildSchema(predicate) {
if (predicate(this))
return this;
let match;
for (let ch of this.children) {
match = ch.findChildSchema(predicate);
if (match !== undefined)
break;
}
return match;
}
/**
* Find a parent schema of the structured type for the given field.
* @param field Field that belongs to the structured type
* @returns The schema of the field
*/
findParentSchemaForField(field) {
return this.findParentSchema((p) => p
.fields({ include_parents: false, include_navigation: true })
.find((f) => f === field) !== undefined);
}
/**
* Picks the fields from attributes.
* @param attrs
* @param include_parents Include the parent fields
* @param include_navigation Include the navigation fields
* @param include_etag Include the etag field
* @returns The picked fields
*/
pick(attrs, { include_id = true, include_key = true, include_parents = true, include_navigation = false, include_computed = false, include_etag = true, } = {}) {
return this.parser.pick(attrs, {
include_id,
include_key,
include_etag,
include_navigation,
include_computed,
include_parents,
options: this.api.options,
});
}
/**
* Deseialize the given value from the structured type.
* @param value Value to deserialize
* @param options Options for deserialization
* @returns Deserialized value
*/
deserialize(value, options) {
return this.parser.deserialize(value, options);
}
/**
* Serialize the given value for the structured type.
* @param value Value to serialize
* @param options Options for serialization
* @returns Serialized value
*/
serialize(value, options) {
return this.parser.serialize(value, options);
}
/**
* Encode the given value for the structured type.
* @param value Value to encode
* @param options Options for encoding
* @returns Encoded value
*/
encode(value, options) {
return this.parser.encode(value, options);
}
/**
* Returns all fields of the structured type.
* @param include_navigation Include navigation properties in the result.
* @param include_parents Include the parent types in the result.
* @returns All fields of the structured type.
*/
fields({ include_navigation, include_parents, }) {
return this.parser.fields({ include_navigation, include_parents });
}
/**
* Returns the keys of the structured type.
* @param include_parents Include the parent fields
* @returns The keys of the structured type
*/
keys({ include_parents = true, } = {}) {
return this.parser.keys({ include_parents });
}
/**
* Resolve the key of the structured type for the given value.
* @param attrs Attributes of the value
* @returns Resolved key
*/
resolveKey(attrs) {
return this.parser.resolveKey(attrs);
}
/**
* Returns the defaults values for the structured type.
* @returns Default values for the structured type
*/
defaults() {
return this.parser.defaults();
}
/**
* Convert the structured type to json schema
* @param options Options for json schema
* @returns Json Schema
*/
toJsonSchema(options = {}) {
return this.parser.toJsonSchema(options);
}
/**
* Validate the given value against the structured type.
* @param attrs Attributes of the value
* @param method Method to use for the process validation
* @returns Object with the errors
*/
validate(attrs, { method, navigation = false, } = {}) {
return this.parser.validate(attrs, { method, navigation });
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9zdHJ1Y3R1cmVkLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JELE9BQU8sRUFJTCx5QkFBeUIsR0FDMUIsTUFBTSxXQUFXLENBQUM7QUFHbkIsTUFBTSxPQUFPLG1CQUF1QixTQUFRLHdCQUczQztJQUNDLElBQUksQ0FBVTtJQUNkLE1BQU0sQ0FBNEI7SUFDbEMsUUFBUSxHQUErQixFQUFFLENBQUM7SUFDMUMsS0FBSyxDQUFxQjtJQUMxQixVQUFVLENBQTBCO0lBRXBDLFlBQVksTUFBNEIsRUFBRSxNQUFtQjtRQUMzRCxLQUFLLENBQ0gsTUFBTSxFQUNOLE1BQU0sRUFDTixJQUFJLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDdEUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUEwQixDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQW9DLENBQUM7SUFDaEUsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBOEI7UUFDL0MsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUN4QyxJQUFJLENBQUMsSUFBSSxDQUNrQixDQUFDO1lBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxD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QUM3QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFFBQVEsQ0FDTixLQUFpQixFQUNqQixFQUNFLE1BQU0sRUFDTixVQUFVLEdBQUcsS0FBSyxNQUloQixFQUFFO1FBRU4sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvY29sbGVjdGlvbic7XG5pbXBvcnQgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL21vZGVsJztcbmltcG9ydCB7XG4gIFBhcnNlck9wdGlvbnMsXG4gIFN0cnVjdHVyZWRUeXBlQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YVBhcnNlclNjaGVtYUVsZW1lbnQgfSBmcm9tICcuL2VsZW1lbnQnO1xuaW1wb3J0IHtcbiAgSnNvblNjaGVtYU9wdGlvbnMsXG4gIE9EYXRhRW50aXR5VHlwZUtleSxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyLFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyLFxufSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IHsgT0RhdGFTY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+IGV4dGVuZHMgT0RhdGFQYXJzZXJTY2hlbWFFbGVtZW50PFxuICBULFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+XG4+IHtcbiAgYmFzZT86IHN0cmluZztcbiAgcGFyZW50PzogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+O1xuICBjaGlsZHJlbjogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+W10gPSBbXTtcbiAgbW9kZWw/OiB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgY29sbGVjdGlvbj86IHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdHJ1Y3R1cmVkVHlwZUNvbmZpZywgc2NoZW1hOiBPRGF0YVNjaGVtYSkge1xuICAgIHN1cGVyKFxuICAgICAgY29uZmlnLFxuICAgICAgc2NoZW1hLFxuICAgICAgbmV3IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIoY29uZmlnLCBzY2hlbWEubmFtZXNwYWNlLCBzY2hlbWEuYWxpYXMpLFxuICAgICk7XG4gICAgdGhpcy5iYXNlID0gY29uZmlnLmJhc2U7XG4gICAgdGhpcy5tb2RlbCA9IGNvbmZpZy5tb2RlbCBhcyB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb25maWcuY29sbGVjdGlvbiBhcyB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICB9XG5cbiAgY29uZmlndXJlKHsgb3B0aW9ucyB9OiB7IG9wdGlvbnM6IFBhcnNlck9wdGlvbnMgfSkge1xuICAgIGlmICh0aGlzLmJhc2UpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZShcbiAgICAgICAgdGhpcy5iYXNlLFxuICAgICAgKSBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT47XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICB0aGlzLnBhcnNlci5jb25maWd1cmUoe1xuICAgICAgb3B0aW9ucyxcbiAgICAgIHBhcnNlckZvclR5cGU6ICh0OiBzdHJpbmcpID0+IHRoaXMuYXBpLnBhcnNlckZvclR5cGUodCksXG4gICAgfSk7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tb2RlbC5tZXRhID0gdGhpcy5hcGkub3B0aW9uc0ZvclR5cGU8VD4odGhpcy50eXBlKCksIHtcbiAgICAgICAgY29uZmlnOiB0aGlzLm1vZGVsLm9wdGlvbnMsXG4gICAgICAgIHN0cnVjdHVyZWRUeXBlOiB0aGlzLFxuICAgICAgfSkhO1xuICAgICAgaWYgKHRoaXMubW9kZWwubWV0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENvbmZpZ3VyZVxuICAgICAgICB0aGlzLm1vZGVsLm1ldGEuY29uZmlndXJlKHsgb3B0aW9ucyB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb24ubW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBzdHJ1Y3R1cmVkIHR5cGUgaXMgYSBzdWJ0eXBlIG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGVcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2FsbGFibGUgaXMgdHlwZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICAgKi9cbiAgb3ZlcnJpZGUgaXNTdWJ0eXBlT2Yoc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuaXNTdWJ0eXBlT2Yoc2NoZW1hKSB8fFxuICAgICAgKHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wYXJlbnQuaXNTdWJ0eXBlT2Yoc2NoZW1hKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHN0cnVjdHVyZWQgdHlwZSBpcyBhIHN1cGVydHlwZSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNhbGxhYmxlIGlzIHR5cGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAgICovXG4gIG92ZXJyaWRlIGlzU3VwZXJ0eXBlT2Yoc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuaXNTdXBlcnR5cGVPZihzY2hlbWEpIHx8XG4gICAgICB0aGlzLmNoaWxkcmVuLnNvbWUoKGMpID0+IGMuaXNTdXBlcnR5cGVPZihzY2hlbWEpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgc3RydWN0dXJlZCB0eXBlIGhhcyBhIHNpbXBsZSBrZXkuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cnVjdHVyZWQgdHlwZSBoYXMgYSBzaW1wbGUga2V5XG4gICAqL1xuICBpc1NpbXBsZUtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5rZXlzKCkubGVuZ3RoID09PSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHN0cnVjdHVyZWQgdHlwZSBoYXMgYSBjb21wb3VuZCBrZXkuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cnVjdHVyZWQgdHlwZSBoYXMgYSBjb21wb3VuZCBrZXkuXG4gICAqL1xuICBpc0NvbXBvdW5kS2V5KCkge1xuICAgIHJldHVybiB0aGlzLmtleXMoKS5sZW5ndGggPiAxO1xuICB9XG5cbiAgaXNPcGVuVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNPcGVuVHlwZSgpO1xuICB9XG5cbiAgaXNFbnRpdHlUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc0VudGl0eVR5cGUoKTtcbiAgfVxuXG4gIGlzQ29tcGxleFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzQ29tcGxleFR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBmaWVsZCBwYXJzZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgcGFyc2VyXG4gICAqL1xuICBmaWVsZDxGPihuYW1lOiBrZXlvZiBUKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmZpZWxkPEY+KG5hbWUpO1xuICB9XG5cbiAgYWRkRmllbGQ8Rj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZzogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyxcbiAgKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuYWRkRmllbGQobmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgcGFyZW50IHNjaGVtYSBvZiB0aGUgc3RydWN0dXJlZCB0eXBlLlxuICAgKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIGZvciBldmFsdWF0ZSB0aGUgc2NoZW1hcyBpbiB0aGUgaGllcmFyY2h5LlxuICAgKiBAcmV0dXJucyBUaGUgc2NoZW1hIHRoYXQgbWF0Y2hlcyB0aGUgcHJlZGljYXRlLlxuICAgKi9cbiAgZmluZFBhcmVudFNjaGVtYShcbiAgICBwcmVkaWNhdGU6IChwOiBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4pID0+IGJvb2xlYW4sXG4gICk6IE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkgcmV0dXJuIHRoaXMgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+O1xuICAgIGlmICh0aGlzLnBhcmVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5maW5kUGFyZW50U2NoZW1hKHByZWRpY2F0ZSk7XG4gIH1cblxuICBmaW5kQ2hpbGRTY2hlbWEoXG4gICAgcHJlZGljYXRlOiAocDogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+KSA9PiBib29sZWFuLFxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcmVkaWNhdGUodGhpcykpIHJldHVybiB0aGlzO1xuICAgIGxldCBtYXRjaDogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIG1hdGNoID0gY2guZmluZENoaWxkU2NoZW1hKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgcGFyZW50IHNjaGVtYSBvZiB0aGUgc3RydWN0dXJlZCB0eXBlIGZvciB0aGUgZ2l2ZW4gZmllbGQuXG4gICAqIEBwYXJhbSBmaWVsZCBGaWVsZCB0aGF0IGJlbG9uZ3MgdG8gdGhlIHN0cnVjdHVyZWQgdHlwZVxuICAgKiBAcmV0dXJucyBUaGUgc2NoZW1hIG9mIHRoZSBmaWVsZFxuICAgKi9cbiAgZmluZFBhcmVudFNjaGVtYUZvckZpZWxkPEU+KGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55Pikge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJlbnRTY2hlbWEoXG4gICAgICAocCkgPT5cbiAgICAgICAgcFxuICAgICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IGZhbHNlLCBpbmNsdWRlX25hdmlnYXRpb246IHRydWUgfSlcbiAgICAgICAgICAuZmluZCgoZikgPT4gZiA9PT0gZmllbGQpICE9PSB1bmRlZmluZWQsXG4gICAgKSBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlPEU+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIHRoZSBmaWVsZHMgZnJvbSBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0gYXR0cnNcbiAgICogQHBhcmFtIGluY2x1ZGVfcGFyZW50cyBJbmNsdWRlIHRoZSBwYXJlbnQgZmllbGRzXG4gICAqIEBwYXJhbSBpbmNsdWRlX25hdmlnYXRpb24gSW5jbHVkZSB0aGUgbmF2aWdhdGlvbiBmaWVsZHNcbiAgICogQHBhcmFtIGluY2x1ZGVfZXRhZyBJbmNsdWRlIHRoZSBldGFnIGZpZWxkXG4gICAqIEByZXR1cm5zIFRoZSBwaWNrZWQgZmllbGRzXG4gICAqL1xuICBwaWNrKFxuICAgIGF0dHJzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICBpbmNsdWRlX2lkID0gdHJ1ZSxcbiAgICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50cyA9IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfZXRhZyA9IHRydWUsXG4gICAgfToge1xuICAgICAgaW5jbHVkZV9pZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX3BhcmVudHM/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9ldGFnPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IFBhcnRpYWw8VD4ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5waWNrKGF0dHJzLCB7XG4gICAgICBpbmNsdWRlX2lkLFxuICAgICAgaW5jbHVkZV9rZXksXG4gICAgICBpbmNsdWRlX2V0YWcsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzLFxuICAgICAgb3B0aW9uczogdGhpcy5hcGkub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlaWFsaXplIHRoZSBnaXZlbiB2YWx1ZSBmcm9tIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBkZXNlcmlhbGl6ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBkZXNlcmlhbGl6YXRpb25cbiAgICogQHJldHVybnMgRGVzZXJpYWxpemVkIHZhbHVlXG4gICAqL1xuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IFQge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5kZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSBnaXZlbiB2YWx1ZSBmb3IgdGhlIHN0cnVjdHVyZWQgdHlwZS5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBzZXJpYWxpemF0aW9uXG4gICAqIEByZXR1cm5zIFNlcmlhbGl6ZWQgdmFsdWVcbiAgICovXG4gIHNlcmlhbGl6ZSh2YWx1ZTogVCwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBlbmNvZGVcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgZW5jb2RpbmdcbiAgICogQHJldHVybnMgRW5jb2RlZCB2YWx1ZVxuICAgKi9cbiAgZW5jb2RlKHZhbHVlOiBULCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlX25hdmlnYXRpb24gSW5jbHVkZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgaW4gdGhlIHJlc3VsdC5cbiAgICogQHBhcmFtIGluY2x1ZGVfcGFyZW50cyBJbmNsdWRlIHRoZSBwYXJlbnQgdHlwZXMgaW4gdGhlIHJlc3VsdC5cbiAgICogQHJldHVybnMgQWxsIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlZCB0eXBlLlxuICAgKi9cbiAgZmllbGRzKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgaW5jbHVkZV9wYXJlbnRzLFxuICB9OiB7XG4gICAgaW5jbHVkZV9wYXJlbnRzOiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogYm9vbGVhbjtcbiAgfSk6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb24sIGluY2x1ZGVfcGFyZW50cyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlX3BhcmVudHMgSW5jbHVkZSB0aGUgcGFyZW50IGZpZWxkc1xuICAgKiBAcmV0dXJucyBUaGUga2V5cyBvZiB0aGUgc3RydWN0dXJlZCB0eXBlXG4gICAqL1xuICBrZXlzKHtcbiAgICBpbmNsdWRlX3BhcmVudHMgPSB0cnVlLFxuICB9OiB7XG4gICAgaW5jbHVkZV9wYXJlbnRzPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogT0RhdGFFbnRpdHlUeXBlS2V5W10ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGtleSBvZiB0aGUgc3RydWN0dXJlZCB0eXBlIGZvciB0aGUgZ2l2ZW4gdmFsdWUuXG4gICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSB2YWx1ZVxuICAgKiBAcmV0dXJucyBSZXNvbHZlZCBrZXlcbiAgICovXG4gIHJlc29sdmVLZXkoYXR0cnM6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5yZXNvbHZlS2V5KGF0dHJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0cyB2YWx1ZXMgZm9yIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqIEByZXR1cm5zIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgc3RydWN0dXJlZCB0eXBlXG4gICAqL1xuICBkZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVmYXVsdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBzdHJ1Y3R1cmVkIHR5cGUgdG8ganNvbiBzY2hlbWFcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IganNvbiBzY2hlbWFcbiAgICogQHJldHVybnMgSnNvbiBTY2hlbWFcbiAgICovXG4gIHRvSnNvblNjaGVtYShvcHRpb25zOiBKc29uU2NoZW1hT3B0aW9uczxUPiA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnRvSnNvblNjaGVtYShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gdmFsdWUgYWdhaW5zdCB0aGUgc3RydWN0dXJlZCB0eXBlLlxuICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgdmFsdWVcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2QgdG8gdXNlIGZvciB0aGUgcHJvY2VzcyB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRoZSBlcnJvcnNcbiAgICovXG4gIHZhbGlkYXRlKFxuICAgIGF0dHJzOiBQYXJ0aWFsPFQ+LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci52YWxpZGF0ZShhdHRycywgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gIH1cbn1cbiJdfQ==