class-validator-jsonschema
Version:
Convert class-validator-decorated classes into JSON schema
360 lines • 24.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const cv = require("class-validator");
const _ = require("lodash");
require("reflect-metadata");
exports.defaultConverters = {
[cv.ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
if (_.isFunction(meta.target)) {
const type = getPropType(meta.target.prototype, meta.propertyName);
return targetToSchema(type, options);
}
},
[cv.ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
if (_.isFunction(meta.target)) {
const typeMeta = options.classTransformerMetadataStorage
? options.classTransformerMetadataStorage.findTypeMetadata(meta.target, meta.propertyName)
: null;
const childType = typeMeta
? typeMeta.typeFunction()
: getPropType(meta.target.prototype, meta.propertyName);
return targetToSchema(childType, options);
}
},
[cv.ValidationTypes.CONDITIONAL_VALIDATION]: {},
[cv.ValidationTypes.IS_DEFINED]: {},
[cv.EQUALS]: (meta) => {
const schema = constraintToSchema(meta.constraints[0]);
if (schema) {
return Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] });
}
},
[cv.NOT_EQUALS]: (meta) => {
const schema = constraintToSchema(meta.constraints[0]);
if (schema) {
return { not: Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] }) };
}
},
[cv.IS_EMPTY]: {
anyOf: [
{ type: 'string', enum: [''] },
{
not: {
anyOf: [
{ type: 'string' },
{ type: 'number' },
{ type: 'boolean' },
{ type: 'integer' },
{ type: 'array' },
{ type: 'object' },
],
},
nullable: true,
},
],
},
[cv.IS_NOT_EMPTY]: {
minLength: 1,
type: 'string',
},
[cv.IS_IN]: (meta) => {
const [head, ...rest] = meta.constraints[0].map(constraintToSchema);
if (head && _.every(rest, { type: head.type })) {
return Object.assign(Object.assign({}, head), { enum: meta.constraints[0] });
}
},
[cv.IS_NOT_IN]: (meta) => {
const [head, ...rest] = meta.constraints[0].map(constraintToSchema);
if (head && _.every(rest, { type: head.type })) {
return { not: Object.assign(Object.assign({}, head), { enum: meta.constraints[0] }) };
}
},
[cv.IS_BOOLEAN]: {
type: 'boolean',
},
[cv.IS_DATE]: {
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' },
],
},
[cv.IS_NUMBER]: {
type: 'number',
},
[cv.IS_STRING]: {
type: 'string',
},
[cv.IS_DATE_STRING]: {
pattern: 'd{4}-[01]d-[0-3]dT[0-2]d:[0-5]d:[0-5]d.d+Z?',
type: 'string',
},
[cv.IS_ARRAY]: {
items: {},
type: 'array',
},
[cv.IS_INT]: {
type: 'integer',
},
[cv.IS_ENUM]: (meta) => {
return {
enum: Object.values(meta.constraints[0]),
type: 'string',
};
},
[cv.IS_DIVISIBLE_BY]: (meta) => ({
multipleOf: meta.constraints[0],
type: 'number',
}),
[cv.IS_POSITIVE]: {
exclusiveMinimum: true,
minimum: 0,
type: 'number',
},
[cv.IS_NEGATIVE]: {
exclusiveMaximum: true,
maximum: 0,
type: 'number',
},
[cv.MIN]: (meta) => ({
minimum: meta.constraints[0],
type: 'number',
}),
[cv.MAX]: (meta) => ({
maximum: meta.constraints[0],
type: 'number',
}),
[cv.MIN_DATE]: (meta) => ({
description: `After ${meta.constraints[0].toJSON()}`,
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' },
],
}),
[cv.MAX_DATE]: (meta) => ({
description: `Before ${meta.constraints[0].toJSON()}`,
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' },
],
}),
[cv.IS_BOOLEAN_STRING]: {
enum: ['true', 'false'],
type: 'string',
},
[cv.IS_NUMBER_STRING]: {
pattern: '^[-+]?[0-9]+$',
type: 'string',
},
[cv.CONTAINS]: (meta) => ({
pattern: meta.constraints[0],
type: 'string',
}),
[cv.NOT_CONTAINS]: (meta) => ({
not: { pattern: meta.constraints[0] },
type: 'string',
}),
[cv.IS_ALPHA]: {
pattern: '^[a-zA-Z]+$',
type: 'string',
},
[cv.IS_ALPHANUMERIC]: {
pattern: '^[0-9a-zA-Z]+$',
type: 'string',
},
[cv.IS_ASCII]: {
pattern: '^[\\x00-\\x7F]+$',
type: 'string',
},
[cv.IS_BASE64]: {
format: 'base64',
type: 'string',
},
[cv.IS_BYTE_LENGTH]: {
type: 'string',
},
[cv.IS_CREDIT_CARD]: {
format: 'credit-card',
type: 'string',
},
[cv.IS_CURRENCY]: {
format: 'currency',
type: 'string',
},
[cv.IS_EMAIL]: {
format: 'email',
type: 'string',
},
[cv.IS_FQDN]: {
format: 'hostname',
type: 'string',
},
[cv.IS_FULL_WIDTH]: {
pattern: '[^\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
type: 'string',
},
[cv.IS_HALF_WIDTH]: {
pattern: '[\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
type: 'string',
},
[cv.IS_VARIABLE_WIDTH]: {
type: 'string',
},
[cv.IS_HEX_COLOR]: {
pattern: '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$',
type: 'string',
},
[cv.IS_HEXADECIMAL]: {
pattern: '^[0-9a-fA-F]+$',
type: 'string',
},
[cv.IS_IP]: (meta) => ({
format: 'ipv' + (meta.constraints[0] === '6' ? 6 : 4),
type: 'string',
}),
[cv.IS_ISBN]: {
format: 'isbn',
type: 'string',
},
[cv.IS_ISIN]: {
format: 'isin',
type: 'string',
},
[cv.IS_ISO8601]: {
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' },
],
},
[cv.IS_JSON]: {
format: 'json',
type: 'string',
},
[cv.IS_LOWERCASE]: {
type: 'string',
},
[cv.IS_MOBILE_PHONE]: {
format: 'mobile-phone',
type: 'string',
},
[cv.IS_MONGO_ID]: {
pattern: '^[0-9a-fA-F]{24}$',
type: 'string',
},
[cv.IS_MULTIBYTE]: {
pattern: '[^\\x00-\\x7F]',
type: 'string',
},
[cv.IS_SURROGATE_PAIR]: {
pattern: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]',
type: 'string',
},
[cv.IS_URL]: {
format: 'url',
type: 'string',
},
[cv.IS_UUID]: {
format: 'uuid',
type: 'string',
},
[cv.LENGTH]: (meta) => {
const [minLength, maxLength] = meta.constraints;
if (maxLength || maxLength === 0) {
return { minLength, maxLength, type: 'string' };
}
return { minLength, type: 'string' };
},
[cv.IS_UPPERCASE]: {
type: 'string',
},
[cv.MIN_LENGTH]: (meta) => ({
minLength: meta.constraints[0],
type: 'string',
}),
[cv.MAX_LENGTH]: (meta) => ({
maxLength: meta.constraints[0],
type: 'string',
}),
[cv.MATCHES]: (meta) => ({
pattern: meta.constraints[0].source,
type: 'string',
}),
[cv.IS_MILITARY_TIME]: {
pattern: '^([01]\\d|2[0-3]):?([0-5]\\d)$',
type: 'string',
},
[cv.ARRAY_CONTAINS]: (meta) => {
const schemas = meta.constraints[0].map(constraintToSchema);
if (schemas.length > 0 && _.every(schemas, 'type')) {
return {
not: {
anyOf: _.map(schemas, (d, i) => ({
items: {
not: Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }),
},
})),
},
type: 'array',
};
}
return { items: {}, type: 'array' };
},
[cv.ARRAY_NOT_CONTAINS]: (meta) => {
const schemas = meta.constraints[0].map(constraintToSchema);
if (schemas.length > 0 && _.every(schemas, 'type')) {
return {
items: {
not: {
anyOf: _.map(schemas, (d, i) => (Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }))),
},
},
type: 'array',
};
}
return { items: {}, type: 'array' };
},
[cv.ARRAY_NOT_EMPTY]: {
items: {},
minItems: 1,
type: 'array',
},
[cv.ARRAY_MIN_SIZE]: (meta) => ({
items: {},
minItems: meta.constraints[0],
type: 'array',
}),
[cv.ARRAY_MAX_SIZE]: (meta) => ({
items: {},
maxItems: meta.constraints[0],
type: 'array',
}),
[cv.ARRAY_UNIQUE]: {
items: {},
type: 'array',
uniqueItems: true,
},
};
function getPropType(target, property) {
return Reflect.getMetadata('design:type', target, property);
}
function constraintToSchema(primitive) {
const primitives = ['string', 'number', 'boolean'];
const type = typeof primitive;
if (_.includes(primitives, type)) {
return { type };
}
}
function targetToSchema(type, options) {
if (_.isFunction(type)) {
if (_.isString(type.prototype) || _.isSymbol(type.prototype)) {
return { type: 'string' };
}
else if (_.isNumber(type.prototype)) {
return { type: 'number' };
}
else if (_.isBoolean(type.prototype)) {
return { type: 'boolean' };
}
return { $ref: options.refPointerPrefix + type.name };
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdENvbnZlcnRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdENvbnZlcnRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxzQ0FBcUM7QUFFckMsNEJBQTJCO0FBRTNCLDRCQUF5QjtBQWFaLFFBQUEsaUJBQWlCLEdBQXNCO0lBQ2xELENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNsRSxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDckM7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDeEQsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsK0JBQStCO2dCQUN0RCxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUN0RCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxZQUFZLENBQ2xCO2dCQUNILENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDUixNQUFNLFNBQVMsR0FBRyxRQUFRO2dCQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtnQkFDekIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDekQsT0FBTyxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1NBQzFDO0lBQ0gsQ0FBQztJQUNELENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUU7SUFDL0MsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUU7SUFDbkMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNwQixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEQsSUFBSSxNQUFNLEVBQUU7WUFDVix1Q0FBWSxNQUFNLEtBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFO1NBQ2xEO0lBQ0gsQ0FBQztJQUNELENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEIsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3RELElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxFQUFFLEdBQUcsa0NBQU8sTUFBTSxLQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRSxFQUFFLENBQUE7U0FDM0Q7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDYixLQUFLLEVBQUU7WUFDTCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDOUI7Z0JBQ0UsR0FBRyxFQUFFO29CQUNILEtBQUssRUFBRTt3QkFDTCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7d0JBQ2xCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDbEIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO3dCQUNuQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7d0JBQ25CLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTt3QkFDakIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO3FCQUNuQjtpQkFDRjtnQkFDRCxRQUFRLEVBQUUsSUFBSTthQUNmO1NBQ0Y7S0FDRjtJQUNELENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ2pCLFNBQVMsRUFBRSxDQUFDO1FBQ1osSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbkIsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDbkUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7WUFDOUMsdUNBQVksSUFBSSxLQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFFO1NBQzlDO0lBQ0gsQ0FBQztJQUNELENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDdkIsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDbkUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7WUFDOUMsT0FBTyxFQUFFLEdBQUcsa0NBQU8sSUFBSSxLQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFFLEVBQUUsQ0FBQTtTQUN2RDtJQUNILENBQUM7SUFDRCxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNmLElBQUksRUFBRSxTQUFTO0tBQ2hCO0lBQ0QsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDWixLQUFLLEVBQUU7WUFDTCxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNsQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtTQUN4QztLQUNGO0lBQ0QsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDZCxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDZCxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDbkIsT0FBTyxFQUFFLDZDQUE2QztRQUN0RCxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDYixLQUFLLEVBQUUsRUFBRTtRQUNULElBQUksRUFBRSxPQUFPO0tBQ2Q7SUFDRCxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNYLElBQUksRUFBRSxTQUFTO0tBQ2hCO0lBQ0QsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNyQixPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUE7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0IsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQztJQUNGLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQ2hCLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsT0FBTyxFQUFFLENBQUM7UUFDVixJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDaEIsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixPQUFPLEVBQUUsQ0FBQztRQUNWLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDO0lBQ0YsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQztJQUNGLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLFdBQVcsRUFBRSxTQUFTLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDcEQsS0FBSyxFQUFFO1lBQ0wsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDbEMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7U0FDeEM7S0FDRixDQUFDO0lBQ0YsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEIsV0FBVyxFQUFFLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNyRCxLQUFLLEVBQUU7WUFDTCxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNsQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtTQUN4QztLQUNGLENBQUM7SUFDRixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3RCLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7UUFDdkIsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDckIsT0FBTyxFQUFFLGVBQWU7UUFDeEIsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUM7SUFDRixDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNyQyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUM7SUFDRixDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNiLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUNwQixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNiLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQ2QsTUFBTSxFQUFFLFFBQVE7UUFDaEIsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ25CLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtRQUNuQixNQUFNLEVBQUUsYUFBYTtRQUNyQixJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDaEIsTUFBTSxFQUFFLFVBQVU7UUFDbEIsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ2IsTUFBTSxFQUFFLE9BQU87UUFDZixJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDWixNQUFNLEVBQUUsVUFBVTtRQUNsQixJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDbEIsT0FBTyxFQUNMLDBFQUEwRTtRQUM1RSxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDbEIsT0FBTyxFQUNMLHlFQUF5RTtRQUMzRSxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUN0QixJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDakIsT0FBTyxFQUFFLHFDQUFxQztRQUM5QyxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDbkIsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckIsTUFBTSxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUM7SUFDRixDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNaLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1osTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDZixLQUFLLEVBQUU7WUFDTCxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNsQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtTQUN4QztLQUNGO0lBQ0QsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDWixNQUFNLEVBQUUsTUFBTTtRQUNkLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUNqQixJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDcEIsTUFBTSxFQUFFLGNBQWM7UUFDdEIsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQ2hCLE9BQU8sRUFBRSxtQkFBbUI7UUFDNUIsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDdEIsT0FBTyxFQUFFLG9DQUFvQztRQUM3QyxJQUFJLEVBQUUsUUFBUTtLQUNmO0lBQ0QsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDWCxNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNaLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZjtJQUNELENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDcEIsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQy9DLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFBO1NBQ2hEO1FBQ0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUE7SUFDdEMsQ0FBQztJQUNELENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDO0lBQ0YsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQztJQUNGLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFDbkMsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDO0lBQ0YsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtRQUNyQixPQUFPLEVBQUUsZ0NBQWdDO1FBQ3pDLElBQUksRUFBRSxRQUFRO0tBQ2Y7SUFDRCxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDM0QsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNsRCxPQUFPO2dCQUNMLEdBQUcsRUFBRTtvQkFDSCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUMvQixLQUFLLEVBQUU7NEJBQ0wsR0FBRyxrQ0FDRSxDQUFDLEtBQ0osSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUMvQjt5QkFDRjtxQkFDRixDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFBO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUE7SUFDckMsQ0FBQztJQUNELENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQzNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDbEQsT0FBTztnQkFDTCxLQUFLLEVBQUU7b0JBQ0wsR0FBRyxFQUFFO3dCQUNILEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlDQUMzQixDQUFDLEtBQ0osSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUM5QixDQUFDO3FCQUNKO2lCQUNGO2dCQUNELElBQUksRUFBRSxPQUFPO2FBQ2QsQ0FBQTtTQUNGO1FBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ3JDLENBQUM7SUFDRCxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUNwQixLQUFLLEVBQUUsRUFBRTtRQUNULFFBQVEsRUFBRSxDQUFDO1FBQ1gsSUFBSSxFQUFFLE9BQU87S0FDZDtJQUNELENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLEtBQUssRUFBRSxFQUFFO1FBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksRUFBRSxPQUFPO0tBQ2QsQ0FBQztJQUNGLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLEtBQUssRUFBRSxFQUFFO1FBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksRUFBRSxPQUFPO0tBQ2QsQ0FBQztJQUNGLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ2pCLEtBQUssRUFBRSxFQUFFO1FBQ1QsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsSUFBSTtLQUNsQjtDQUNGLENBQUE7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7SUFDbkQsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDN0QsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsU0FBYztJQUN4QyxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDbEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxTQUFTLENBQUE7SUFDN0IsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRTtRQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUE7S0FDaEI7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBUyxFQUFFLE9BQWlCO0lBQ2xELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzVELE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUE7U0FDMUI7YUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUE7U0FDMUI7YUFBTSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUE7U0FDM0I7UUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7S0FDdEQ7QUFDSCxDQUFDIn0=