/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(null, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define("@angular/common/locales/extra/ta-SG", ["require", "exports"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    // THIS CODE IS GENERATED - DO NOT MODIFY
    // See angular/tools/gulp-tasks/cldr/extract.js
    var u = undefined;
    exports.default = [
        [
            ['நள்.', 'நண்.', 'அதி.', 'கா.', 'மதி.', 'பிற்.', 'மா.', 'அந்தி மா.', 'இர.'],
            ['நள்ளிரவு', 'நண்பகல்', 'அதிகாலை', 'காலை', 'மதியம்', 'பிற்பகல்', 'மாலை', 'அந்தி மாலை', 'இரவு'], u
        ],
        [
            ['நள்.', 'நண்.', 'அதி.', 'கா.', 'மதி.', 'பிற்.', 'மா.', 'அந்தி மா.', 'இ.'],
            ['நள்ளிரவு', 'நண்பகல்', 'அதிகாலை', 'காலை', 'மதியம்', 'பிற்பகல்', 'மாலை', 'அந்தி மாலை', 'இரவு'], u
        ],
        [
            '00:00', '12:00', ['03:00', '05:00'], ['05:00', '12:00'], ['12:00', '14:00'],
            ['14:00', '16:00'], ['16:00', '18:00'], ['18:00', '21:00'], ['21:00', '03:00']
        ]
    ];
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGEtU0cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9leHRyYS90YS1TRy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLGtCQUFlO1FBQ2I7WUFDRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDO1lBQzNFLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1NBQ2xHO1FBQ0Q7WUFDRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDO1lBQzFFLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1NBQ2xHO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUM1RSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7U0FDL0U7S0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gIFtcbiAgICBbJ+CuqOCus+CvjS4nLCAn4K6o4K6j4K+NLicsICfgroXgrqTgrr8uJywgJ+CuleCuvi4nLCAn4K6u4K6k4K6/LicsICfgrqrgrr/grrHgr40uJywgJ+CuruCuvi4nLCAn4K6F4K6o4K+N4K6k4K6/IOCuruCuvi4nLCAn4K6H4K6wLiddLFxuICAgIFsn4K6o4K6z4K+N4K6z4K6/4K6w4K614K+BJywgJ+CuqOCuo+CvjeCuquCuleCusuCvjScsICfgroXgrqTgrr/grpXgrr7grrLgr4gnLCAn4K6V4K6+4K6y4K+IJywgJ+CuruCupOCuv+Cur+CuruCvjScsICfgrqrgrr/grrHgr43grqrgrpXgrrLgr40nLCAn4K6u4K6+4K6y4K+IJywgJ+CuheCuqOCvjeCupOCuvyDgrq7grr7grrLgr4gnLCAn4K6H4K6w4K614K+BJ10sIHVcbiAgXSxcbiAgW1xuICAgIFsn4K6o4K6z4K+NLicsICfgrqjgrqPgr40uJywgJ+CuheCupOCuvy4nLCAn4K6V4K6+LicsICfgrq7grqTgrr8uJywgJ+CuquCuv+CuseCvjS4nLCAn4K6u4K6+LicsICfgroXgrqjgr43grqTgrr8g4K6u4K6+LicsICfgrocuJ10sXG4gICAgWyfgrqjgrrPgr43grrPgrr/grrDgrrXgr4EnLCAn4K6o4K6j4K+N4K6q4K6V4K6y4K+NJywgJ+CuheCupOCuv+CuleCuvuCusuCviCcsICfgrpXgrr7grrLgr4gnLCAn4K6u4K6k4K6/4K6v4K6u4K+NJywgJ+CuquCuv+CuseCvjeCuquCuleCusuCvjScsICfgrq7grr7grrLgr4gnLCAn4K6F4K6o4K+N4K6k4K6/IOCuruCuvuCusuCviCcsICfgrofgrrDgrrXgr4EnXSwgdVxuICBdLFxuICBbXG4gICAgJzAwOjAwJywgJzEyOjAwJywgWycwMzowMCcsICcwNTowMCddLCBbJzA1OjAwJywgJzEyOjAwJ10sIFsnMTI6MDAnLCAnMTQ6MDAnXSxcbiAgICBbJzE0OjAwJywgJzE2OjAwJ10sIFsnMTY6MDAnLCAnMTg6MDAnXSwgWycxODowMCcsICcyMTowMCddLCBbJzIxOjAwJywgJzAzOjAwJ11cbiAgXVxuXTtcbiJdfQ==