# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Ignore the .git directory.
\.git

# CHANGES and MANIFEST files do not require license headers.
CHANGES
MANIFEST

# doc file does not require license.
CONTRIBUTING

# The Lemon parser generator is in the public domain.  See LUCY-173.
lemon\.c
lempar\.c

# The Snowball stemmer source code files do not contain license headers, by
# choice of the Snowball developers.  See
# modules/analysis/snowstem/source/README.
snowstem

# This file is autogenerated, as indicated in the comment at the top.
snowball_stoplists\.c

# The Unicode license as applied to utf8proc and the Unicode Character Database
# was dealt with in LEGAL-110.
utf8proc_data\.h
WordBreak\.tab

# The text of the US constitution is in the public domain.
us_constitution

# JSON does not allow comments
.*\.json

# Clownfish parcel files (.cfp) are in JSON format and cannot have comments.
.*\.cfp

# gitignore files should be ignored
\.gitignore
