| 
						 | 
						- {{# def.definitions }}
 - {{# def.errors }}
 - {{# def.setupKeyword }}
 - {{# def.setupNextLevel }}
 - 
 - 
 - {{## def.validateAdditional:
 -   {{ /* additionalProperties is schema */
 -     $it.schema = $aProperties;
 -     $it.schemaPath = it.schemaPath + '.additionalProperties';
 -     $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
 -     $it.errorPath = it.opts._errorDataPathProperty
 -                     ? it.errorPath
 -                     : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
 -     var $passData = $data + '[' + $key + ']';
 -     $it.dataPathArr[$dataNxt] = $key;
 -   }}
 - 
 -   {{# def.generateSubschemaCode }}
 -   {{# def.optimizeValidate }}
 - #}}
 - 
 - 
 - {{
 -   var $key = 'key' + $lvl
 -     , $idx = 'idx' + $lvl
 -     , $dataNxt = $it.dataLevel = it.dataLevel + 1
 -     , $nextData = 'data' + $dataNxt
 -     , $dataProperties = 'dataProperties' + $lvl;
 - 
 -   var $schemaKeys = Object.keys($schema || {}).filter(notProto)
 -     , $pProperties = it.schema.patternProperties || {}
 -     , $pPropertyKeys = Object.keys($pProperties).filter(notProto)
 -     , $aProperties = it.schema.additionalProperties
 -     , $someProperties = $schemaKeys.length || $pPropertyKeys.length
 -     , $noAdditional = $aProperties === false
 -     , $additionalIsSchema = typeof $aProperties == 'object'
 -                               && Object.keys($aProperties).length
 -     , $removeAdditional = it.opts.removeAdditional
 -     , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional
 -     , $ownProperties = it.opts.ownProperties
 -     , $currentBaseId = it.baseId;
 - 
 -   var $required = it.schema.required;
 -   if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
 -     var $requiredHash = it.util.toHash($required);
 -   }
 - 
 -   function notProto(p) { return p !== '__proto__'; }
 - }}
 - 
 - 
 - var {{=$errs}} = errors;
 - var {{=$nextValid}} = true;
 - {{? $ownProperties }}
 -   var {{=$dataProperties}} = undefined;
 - {{?}}
 - 
 - {{? $checkAdditional }}
 -   {{# def.iterateProperties }}
 -     {{? $someProperties }}
 -       var isAdditional{{=$lvl}} = !(false
 -         {{? $schemaKeys.length }}
 -           {{? $schemaKeys.length > 8 }}
 -             || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}})
 -           {{??}}
 -             {{~ $schemaKeys:$propertyKey }}
 -               || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }}
 -             {{~}}
 -           {{?}}
 -         {{?}}
 -         {{? $pPropertyKeys.length }}
 -           {{~ $pPropertyKeys:$pProperty:$i }}
 -             || {{= it.usePattern($pProperty) }}.test({{=$key}})
 -           {{~}}
 -         {{?}}
 -       );
 - 
 -       if (isAdditional{{=$lvl}}) {
 -     {{?}}
 -     {{? $removeAdditional == 'all' }}
 -       delete {{=$data}}[{{=$key}}];
 -     {{??}}
 -       {{
 -         var $currentErrorPath = it.errorPath;
 -         var $additionalProperty = '\' + ' + $key + ' + \'';
 -         if (it.opts._errorDataPathProperty) {
 -           it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
 -         }
 -       }}
 -       {{? $noAdditional }}
 -         {{? $removeAdditional }}
 -           delete {{=$data}}[{{=$key}}];
 -         {{??}}
 -           {{=$nextValid}} = false;
 -           {{
 -             var $currErrSchemaPath = $errSchemaPath;
 -             $errSchemaPath = it.errSchemaPath + '/additionalProperties';
 -           }}
 -           {{# def.error:'additionalProperties' }}
 -           {{ $errSchemaPath = $currErrSchemaPath; }}
 -           {{? $breakOnError }} break; {{?}}
 -         {{?}}
 -       {{?? $additionalIsSchema }}
 -         {{? $removeAdditional == 'failing' }}
 -           var {{=$errs}} = errors;
 -           {{# def.setCompositeRule }}
 - 
 -           {{# def.validateAdditional }}
 - 
 -           if (!{{=$nextValid}}) {
 -             errors = {{=$errs}};
 -             if (validate.errors !== null) {
 -               if (errors) validate.errors.length = errors;
 -               else validate.errors = null;
 -             }
 -             delete {{=$data}}[{{=$key}}];
 -           }
 - 
 -           {{# def.resetCompositeRule }}
 -         {{??}}
 -           {{# def.validateAdditional }}
 -           {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
 -         {{?}}
 -       {{?}}
 -       {{ it.errorPath = $currentErrorPath; }}
 -     {{?}}
 -     {{? $someProperties }}
 -       }
 -     {{?}}
 -   }
 - 
 -   {{# def.ifResultValid }}
 - {{?}}
 - 
 - {{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }}
 - 
 - {{? $schemaKeys.length }}
 -   {{~ $schemaKeys:$propertyKey }}
 -     {{ var $sch = $schema[$propertyKey]; }}
 - 
 -     {{? {{# def.nonEmptySchema:$sch}} }}
 -       {{
 -         var $prop = it.util.getProperty($propertyKey)
 -           , $passData = $data + $prop
 -           , $hasDefault = $useDefaults && $sch.default !== undefined;
 -         $it.schema = $sch;
 -         $it.schemaPath = $schemaPath + $prop;
 -         $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
 -         $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
 -         $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
 -       }}
 - 
 -       {{# def.generateSubschemaCode }}
 - 
 -       {{? {{# def.willOptimize }} }}
 -         {{
 -           $code = {{# def._optimizeValidate }};
 -           var $useData = $passData;
 -         }}
 -       {{??}}
 -         {{ var $useData = $nextData; }}
 -         var {{=$nextData}} = {{=$passData}};
 -       {{?}}
 - 
 -       {{? $hasDefault }}
 -         {{= $code }}
 -       {{??}}
 -         {{? $requiredHash && $requiredHash[$propertyKey] }}
 -           if ({{# def.noPropertyInData }}) {
 -             {{=$nextValid}} = false;
 -             {{
 -               var $currentErrorPath = it.errorPath
 -                 , $currErrSchemaPath = $errSchemaPath
 -                 , $missingProperty = it.util.escapeQuotes($propertyKey);
 -               if (it.opts._errorDataPathProperty) {
 -                 it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
 -               }
 -               $errSchemaPath = it.errSchemaPath + '/required';
 -             }}
 -             {{# def.error:'required' }}
 -             {{ $errSchemaPath = $currErrSchemaPath; }}
 -             {{ it.errorPath = $currentErrorPath; }}
 -           } else {
 -         {{??}}
 -           {{? $breakOnError }}
 -             if ({{# def.noPropertyInData }}) {
 -               {{=$nextValid}} = true;
 -             } else {
 -           {{??}}
 -             if ({{=$useData}} !== undefined
 -               {{? $ownProperties }}
 -                 && {{# def.isOwnProperty }}
 -               {{?}}
 -             ) {
 -           {{?}}
 -         {{?}}
 - 
 -           {{= $code }}
 -         }
 -       {{?}}  {{ /* $hasDefault */ }}
 -     {{?}} {{ /* def.nonEmptySchema */ }}
 - 
 -     {{# def.ifResultValid }}
 -   {{~}}
 - {{?}}
 - 
 - {{? $pPropertyKeys.length }}
 -   {{~ $pPropertyKeys:$pProperty }}
 -     {{ var $sch = $pProperties[$pProperty]; }}
 - 
 -     {{? {{# def.nonEmptySchema:$sch}} }}
 -       {{
 -         $it.schema = $sch;
 -         $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
 -         $it.errSchemaPath = it.errSchemaPath + '/patternProperties/'
 -                                              + it.util.escapeFragment($pProperty);
 -       }}
 - 
 -       {{# def.iterateProperties }}
 -         if ({{= it.usePattern($pProperty) }}.test({{=$key}})) {
 -           {{
 -             $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
 -             var $passData = $data + '[' + $key + ']';
 -             $it.dataPathArr[$dataNxt] = $key;
 -           }}
 - 
 -           {{# def.generateSubschemaCode }}
 -           {{# def.optimizeValidate }}
 - 
 -           {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
 -         }
 -         {{? $breakOnError }} else {{=$nextValid}} = true; {{?}}
 -       }
 - 
 -       {{# def.ifResultValid }}
 -     {{?}} {{ /* def.nonEmptySchema */ }}
 -   {{~}}
 - {{?}}
 - 
 - 
 - {{? $breakOnError }}
 -   {{= $closingBraces }}
 -   if ({{=$errs}} == errors) {
 - {{?}}
 
 
  |