// stringlint:disable #import "MIMETypeUtil.h" #import "OWSFileSystem.h" #if TARGET_OS_IPHONE #import #else #import #endif NS_ASSUME_NONNULL_BEGIN NSString *const OWSMimeTypeApplicationOctetStream = @"application/octet-stream"; NSString *const OWSMimeTypeImagePng = @"image/png"; NSString *const OWSMimeTypeImageJpeg = @"image/jpeg"; NSString *const OWSMimeTypeImageGif = @"image/gif"; NSString *const OWSMimeTypeImageTiff1 = @"image/tiff"; NSString *const OWSMimeTypeImageTiff2 = @"image/x-tiff"; NSString *const OWSMimeTypeImageBmp1 = @"image/bmp"; NSString *const OWSMimeTypeImageBmp2 = @"image/x-windows-bmp"; NSString *const OWSMimeTypeImageWebp = @"image/webp"; NSString *const OWSMimeTypeImageHeic = @"image/heic"; NSString *const OWSMimeTypeImageHeif = @"image/heif"; NSString *const OWSMimeTypeUnknownForTests = @"unknown/mimetype"; NSString *const OWSMimeTypeApplicationZip = @"application/zip"; NSString *const OWSMimeTypeApplicationPdf = @"application/pdf"; NSString *const kTextAttachmentFileExtension = @"txt"; NSString *const kUnknownTestAttachmentUTI = @"org.whispersystems.unknown"; NSString *const kSyncMessageFileExtension = @"bin"; @implementation MIMETypeUtil + (NSDictionary *)supportedVideoMIMETypesToExtensionTypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"video/3gpp" : @"3gp", @"video/3gpp2" : @"3g2", @"video/mp4" : @"mp4", @"video/quicktime" : @"mov", @"video/x-m4v" : @"m4v", @"video/mpeg" : @"mpg", }; }); return result; } + (NSDictionary *)supportedAudioMIMETypesToExtensionTypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"audio/aac" : @"m4a", @"audio/x-m4p" : @"m4p", @"audio/x-m4b" : @"m4b", @"audio/x-m4a" : @"m4a", @"audio/wav" : @"wav", @"audio/x-wav" : @"wav", @"audio/x-mpeg" : @"mp3", @"audio/mpeg" : @"mp3", @"audio/mp4" : @"mp4", @"audio/mp3" : @"mp3", @"audio/mpeg3" : @"mp3", @"audio/x-mp3" : @"mp3", @"audio/x-mpeg3" : @"mp3", @"audio/aiff" : @"aiff", @"audio/x-aiff" : @"aiff", @"audio/3gpp2" : @"3g2", @"audio/3gpp" : @"3gp", }; }); return result; } + (NSDictionary *)supportedImageMIMETypesToExtensionTypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ OWSMimeTypeImageJpeg : @"jpeg", @"image/pjpeg" : @"jpeg", OWSMimeTypeImagePng : @"png", @"image/tiff" : @"tif", @"image/x-tiff" : @"tif", @"image/bmp" : @"bmp", @"image/x-windows-bmp" : @"bmp", @"image/gif" : @"gif", @"image/x-icon": @"ico", OWSMimeTypeImageWebp : @"webp" }; }); return result; } + (NSDictionary *)supportedAnimatedMIMETypesToExtensionTypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ OWSMimeTypeImageGif : @"gif", OWSMimeTypeImageWebp : @"image/webp", }; }); return result; } + (NSDictionary *)supportedBinaryDataMIMETypesToExtensionTypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ OWSMimeTypeApplicationOctetStream : @"dat", }; }); return result; } + (NSDictionary *)supportedVideoExtensionTypesToMIMETypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"3gp" : @"video/3gpp", @"3gpp" : @"video/3gpp", @"3gp2" : @"video/3gpp2", @"3gpp2" : @"video/3gpp2", @"mp4" : @"video/mp4", @"mov" : @"video/quicktime", @"mqv" : @"video/quicktime", @"m4v" : @"video/x-m4v", @"mpg" : @"video/mpeg", @"mpeg" : @"video/mpeg", }; }); return result; } + (NSDictionary *)supportedAudioExtensionTypesToMIMETypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"3gp" : @"audio/3gpp", @"3gpp" : @"@audio/3gpp", @"3g2" : @"audio/3gpp2", @"3gp2" : @"audio/3gpp2", @"aiff" : @"audio/aiff", @"aif" : @"audio/aiff", @"aifc" : @"audio/aiff", @"cdda" : @"audio/aiff", @"mp3" : @"audio/mp3", @"swa" : @"audio/mp3", @"mp4" : @"audio/mp4", @"wav" : @"audio/wav", @"bwf" : @"audio/wav", @"m4a" : @"audio/x-m4a", @"m4b" : @"audio/x-m4b", @"m4p" : @"audio/x-m4p" }; }); return result; } + (NSDictionary *)supportedImageExtensionTypesToMIMETypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"png" : OWSMimeTypeImagePng, @"x-png" : OWSMimeTypeImagePng, @"jfif" : @"image/jpeg", @"jfif" : @"image/pjpeg", @"jfif-tbnl" : @"image/jpeg", @"jpe" : @"image/jpeg", @"jpe" : @"image/pjpeg", @"jpeg" : @"image/jpeg", @"jpg" : @"image/jpeg", @"tif" : @"image/tiff", @"tiff" : @"image/tiff", @"webp" : OWSMimeTypeImageWebp }; }); return result; } + (NSDictionary *)supportedAnimatedExtensionTypesToMIMETypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"gif" : OWSMimeTypeImageGif, @"image/webp" : OWSMimeTypeImageWebp }; }); return result; } + (BOOL)isSupportedVideoMIMEType:(NSString *)contentType { return [[self supportedVideoMIMETypesToExtensionTypes] objectForKey:contentType] != nil; } + (BOOL)isSupportedAudioMIMEType:(NSString *)contentType { return [[self supportedAudioMIMETypesToExtensionTypes] objectForKey:contentType] != nil; } + (BOOL)isSupportedImageMIMEType:(NSString *)contentType { return [[self supportedImageMIMETypesToExtensionTypes] objectForKey:contentType] != nil; } + (BOOL)isSupportedAnimatedMIMEType:(NSString *)contentType { return [[self supportedAnimatedMIMETypesToExtensionTypes] objectForKey:contentType] != nil; } + (BOOL)isSupportedBinaryDataMIMEType:(NSString *)contentType { return [[self supportedBinaryDataMIMETypesToExtensionTypes] objectForKey:contentType] != nil; } + (BOOL)isSupportedVideoFile:(NSString *)filePath { return [[self supportedVideoExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil; } + (BOOL)isSupportedAudioFile:(NSString *)filePath { return [[self supportedAudioExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil; } + (BOOL)isSupportedImageFile:(NSString *)filePath { return [[self supportedImageExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil; } + (BOOL)isSupportedAnimatedFile:(NSString *)filePath { return [[self supportedAnimatedExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil; } + (nullable NSString *)getSupportedExtensionFromVideoMIMEType:(NSString *)supportedMIMEType { return [[self supportedVideoMIMETypesToExtensionTypes] objectForKey:supportedMIMEType]; } + (nullable NSString *)getSupportedExtensionFromAudioMIMEType:(NSString *)supportedMIMEType { return [[self supportedAudioMIMETypesToExtensionTypes] objectForKey:supportedMIMEType]; } + (nullable NSString *)getSupportedExtensionFromImageMIMEType:(NSString *)supportedMIMEType { return [[self supportedImageMIMETypesToExtensionTypes] objectForKey:supportedMIMEType]; } + (nullable NSString *)getSupportedExtensionFromAnimatedMIMEType:(NSString *)supportedMIMEType { return [[self supportedAnimatedMIMETypesToExtensionTypes] objectForKey:supportedMIMEType]; } + (nullable NSString *)getSupportedExtensionFromBinaryDataMIMEType:(NSString *)supportedMIMEType { return [[self supportedBinaryDataMIMETypesToExtensionTypes] objectForKey:supportedMIMEType]; } #pragma mark full attachment utilities + (BOOL)isAnimated:(NSString *)contentType { return [MIMETypeUtil isSupportedAnimatedMIMEType:contentType]; } + (BOOL)isBinaryData:(NSString *)contentType { return [MIMETypeUtil isSupportedBinaryDataMIMEType:contentType]; } + (BOOL)isImage:(NSString *)contentType { return [MIMETypeUtil isSupportedImageMIMEType:contentType]; } + (BOOL)isVideo:(NSString *)contentType { return [MIMETypeUtil isSupportedVideoMIMEType:contentType]; } + (BOOL)isAudio:(NSString *)contentType { return [MIMETypeUtil isSupportedAudioMIMEType:contentType]; } + (BOOL)isText:(NSString *)contentType { return [ @[ @"text/plain", @"text/csv", @"text/tab-separated-values" ] containsObject:contentType ]; } + (BOOL)isMicrosoftDoc:(NSString *)contentType { return [ @[ // Word files @"application/msword", @"application/vnd.openxmlformats-officedocument.wordprocessingml.document", @"application/vnd.openxmlformats-officedocument.wordprocessingml.template", @"application/vnd.ms-word.document.macroEnabled.12", @"application/vnd.ms-word.template.macroEnabled.12", // Excel files @"application/vnd.ms-excel", @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @"application/vnd.openxmlformats-officedocument.spreadsheetml.template", @"application/vnd.ms-excel.sheet.macroEnabled.12", @"application/vnd.ms-excel.template.macroEnabled.12", @"application/vnd.ms-excel.addin.macroEnabled.12", @"application/vnd.ms-excel.sheet.binary.macroEnabled.12", // Powerpoint files @"application/vnd.ms-powerpoint", @"application/vnd.openxmlformats-officedocument.presentationml.presentation", @"application/vnd.openxmlformats-officedocument.presentationml.template", @"application/vnd.openxmlformats-officedocument.presentationml.slideshow", @"application/vnd.ms-powerpoint.addin.macroEnabled.12", @"application/vnd.ms-powerpoint.presentation.macroEnabled.12", @"application/vnd.ms-powerpoint.template.macroEnabled.12", @"application/vnd.ms-powerpoint.slideshow.macroEnabled.12" ] containsObject:contentType ]; } + (BOOL)isVisualMedia:(NSString *)contentType { if ([self isImage:contentType]) { return YES; } if ([self isVideo:contentType]) { return YES; } if ([self isAnimated:contentType]) { return YES; } return NO; } + (nullable NSString *)filePathForAttachment:(NSString *)uniqueId ofMIMEType:(NSString *)contentType sourceFilename:(nullable NSString *)sourceFilename inFolder:(NSString *)folder { NSString *kDefaultFileExtension = @"bin"; if (sourceFilename.length > 0) { NSString *normalizedFilename = [sourceFilename stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; // Ensure that the filename is a valid filesystem name, // replacing invalid characters with an underscore. for (NSCharacterSet *invalidCharacterSet in @[ [NSCharacterSet whitespaceAndNewlineCharacterSet], [NSCharacterSet illegalCharacterSet], [NSCharacterSet controlCharacterSet], [NSCharacterSet characterSetWithCharactersInString:@"<>|\\:()&;?*/~"], ]) { normalizedFilename = [[normalizedFilename componentsSeparatedByCharactersInSet:invalidCharacterSet] componentsJoinedByString:@"_"]; } // Remove leading periods to prevent hidden files, // "." and ".." special file names. while ([normalizedFilename hasPrefix:@"."]) { normalizedFilename = [normalizedFilename substringFromIndex:1]; } NSString *fileExtension = [[normalizedFilename pathExtension] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSString *filenameWithoutExtension = [[[normalizedFilename lastPathComponent] stringByDeletingPathExtension] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; // If the filename has not file extension, deduce one // from the MIME type. if (fileExtension.length < 1) { fileExtension = [self fileExtensionForMIMEType:contentType]; if (fileExtension.length < 1) { fileExtension = kDefaultFileExtension; } } fileExtension = [fileExtension lowercaseString]; if (filenameWithoutExtension.length > 0) { // Store the file in a subdirectory whose name is the uniqueId of this attachment, // to avoid collisions between multiple attachments with the same name. NSString *attachmentFolderPath = [folder stringByAppendingPathComponent:uniqueId]; if (![OWSFileSystem ensureDirectoryExists:attachmentFolderPath]) { return nil; } return [attachmentFolderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", filenameWithoutExtension, fileExtension]]; } } if ([self isVideo:contentType]) { return [MIMETypeUtil filePathForVideo:uniqueId ofMIMEType:contentType inFolder:folder]; } else if ([self isAudio:contentType]) { return [MIMETypeUtil filePathForAudio:uniqueId ofMIMEType:contentType inFolder:folder]; } else if ([self isImage:contentType]) { return [MIMETypeUtil filePathForImage:uniqueId ofMIMEType:contentType inFolder:folder]; } else if ([self isAnimated:contentType]) { return [MIMETypeUtil filePathForAnimated:uniqueId ofMIMEType:contentType inFolder:folder]; } else if ([self isBinaryData:contentType]) { return [MIMETypeUtil filePathForBinaryData:uniqueId ofMIMEType:contentType inFolder:folder]; } else if ([contentType isEqualToString:OWSMimeTypeUnknownForTests]) { // This file extension is arbitrary - it should never be exposed to the user or // be used outside the app. return [self filePathForData:uniqueId withFileExtension:@"unknown" inFolder:folder]; } NSString *fileExtension = [self fileExtensionForMIMEType:contentType]; if (fileExtension) { return [self filePathForData:uniqueId withFileExtension:fileExtension inFolder:folder]; } // Use a fallback file extension. return [self filePathForData:uniqueId withFileExtension:kDefaultFileExtension inFolder:folder]; } + (NSString *)filePathForImage:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder { return [self filePathForData:uniqueId withFileExtension:[self getSupportedExtensionFromImageMIMEType:contentType] inFolder:folder]; } + (NSString *)filePathForVideo:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder { return [self filePathForData:uniqueId withFileExtension:[self getSupportedExtensionFromVideoMIMEType:contentType] inFolder:folder]; } + (NSString *)filePathForAudio:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder { return [self filePathForData:uniqueId withFileExtension:[self getSupportedExtensionFromAudioMIMEType:contentType] inFolder:folder]; } + (NSString *)filePathForAnimated:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder { return [self filePathForData:uniqueId withFileExtension:[self getSupportedExtensionFromAnimatedMIMEType:contentType] inFolder:folder]; } + (NSString *)filePathForBinaryData:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder { return [self filePathForData:uniqueId withFileExtension:[self getSupportedExtensionFromBinaryDataMIMEType:contentType] inFolder:folder]; } + (NSString *)filePathForData:(NSString *)uniqueId withFileExtension:(NSString *)fileExtension inFolder:(NSString *)folder { return [folder stringByAppendingPathComponent:[uniqueId stringByAppendingPathExtension:fileExtension]]; } + (nullable NSString *)utiTypeForMIMEType:(NSString *)mimeType { NSString *utiType = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag( kUTTagClassMIMEType, (__bridge CFStringRef)mimeType, NULL); if (!utiType) { if ([mimeType isEqualToString:@"audio/amr"]) { utiType = @"org.3gpp.adaptive-multi-rate-audio"; } else if ([mimeType isEqualToString:@"audio/mp3"] || [mimeType isEqualToString:@"audio/x-mpeg"] || [mimeType isEqualToString:@"audio/mpeg"] || [mimeType isEqualToString:@"audio/mpeg3"] || [mimeType isEqualToString:@"audio/x-mp3"] || [mimeType isEqualToString:@"audio/x-mpeg3"]) { utiType = (NSString *)kUTTypeMP3; } else if ([mimeType isEqualToString:@"audio/aac"] || [mimeType isEqualToString:@"audio/x-m4a"]) { utiType = (NSString *)kUTTypeMPEG4Audio; } else if ([mimeType isEqualToString:@"audio/aiff"] || [mimeType isEqualToString:@"audio/x-aiff"]) { utiType = (NSString *)kUTTypeAudioInterchangeFileFormat; } } return utiType; } + (nullable NSString *)fileExtensionForUTIType:(NSString *)utiType { // Special-case the "aac" filetype we use for voice messages (for legacy reasons) // to use a .m4a file extension, not .aac, since AVAudioPlayer can't handle .aac // properly. Doesn't affect file contents. if ([utiType isEqualToString:@"public.aac-audio"]) { return @"m4a"; } CFStringRef fileExtension = UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)utiType, kUTTagClassFilenameExtension); return (__bridge_transfer NSString *)fileExtension; } + (nullable NSString *)fileExtensionForMIMETypeViaUTIType:(NSString *)mimeType { NSString *utiType = [self utiTypeForMIMEType:mimeType]; if (!utiType) { return nil; } NSString *fileExtension = [self fileExtensionForUTIType:utiType]; return fileExtension; } + (NSSet *)utiTypesForMIMETypes:(NSArray *)mimeTypes { NSMutableSet *result = [NSMutableSet new]; for (NSString *mimeType in mimeTypes) { NSString *_Nullable utiType = [self utiTypeForMIMEType:mimeType]; if (!utiType) { continue; } [result addObject:utiType]; } return result; } + (NSSet *)supportedVideoUTITypes { static NSSet *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = [self utiTypesForMIMETypes:[self supportedVideoMIMETypesToExtensionTypes].allKeys]; }); return result; } + (NSSet *)supportedAudioUTITypes { static NSSet *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = [self utiTypesForMIMETypes:[self supportedAudioMIMETypesToExtensionTypes].allKeys]; }); return result; } + (NSSet *)supportedImageUTITypes { static NSSet *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = [self utiTypesForMIMETypes:[self supportedImageMIMETypesToExtensionTypes].allKeys]; }); return result; } + (NSSet *)supportedAnimatedImageUTITypes { static NSSet *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = [self utiTypesForMIMETypes:[self supportedAnimatedMIMETypesToExtensionTypes].allKeys]; }); return result; } + (NSArray *)supportedImageMIMETypes { static NSArray *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = [self supportedImageMIMETypesToExtensionTypes].allKeys; }); return result; } + (NSArray *)supportedAnimatedImageMIMETypes { static NSArray *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = [self supportedAnimatedMIMETypesToExtensionTypes].allKeys; }); return result; } + (NSArray *)supportedVideoMIMETypes { static NSArray *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = [self supportedVideoMIMETypesToExtensionTypes].allKeys; }); return result; } + (NSDictionary *)genericMIMETypesToExtensionTypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"application/acad" : @"dwg", @"application/andrew-inset" : @"ez", @"application/applixware" : @"aw", @"application/arj" : @"arj", @"application/atom+xml" : @"atom", @"application/atomcat+xml" : @"atomcat", @"application/atomsvc+xml" : @"atomsvc", @"application/binhex" : @"hqx", @"application/binhex4" : @"hqx", @"application/book" : @"book", @"application/ccxml+xml" : @"ccxml", @"application/cdf" : @"cdf", @"application/cdmi-capability" : @"cdmia", @"application/cdmi-container" : @"cdmic", @"application/cdmi-domain" : @"cdmid", @"application/cdmi-object" : @"cdmio", @"application/cdmi-queue" : @"cdmiq", @"application/clariscad" : @"ccad", @"application/commonground" : @"dp", @"application/cu-seeme" : @"cu", @"application/davmount+xml" : @"davmount", @"application/docbook+xml" : @"dbk", @"application/drafting" : @"drw", @"application/dsptype" : @"tsp", @"application/dssc+der" : @"dssc", @"application/dssc+xml" : @"xdssc", @"application/dxf" : @"dxf", @"application/ecmascript" : @"js", @"application/emma+xml" : @"emma", @"application/envoy" : @"evy", @"application/epub+zip" : @"epub", @"application/excel" : @"xls", @"application/exi" : @"exi", @"application/font-tdpfr" : @"pfr", @"application/font-woff" : @"woff", @"application/fractals" : @"fif", @"application/freeloader" : @"frl", @"application/futuresplash" : @"spl", @"application/gml+xml" : @"gml", @"application/gnutar" : @"tgz", @"application/gpx+xml" : @"gpx", @"application/groupwise" : @"vew", @"application/gxf" : @"gxf", @"application/hlp" : @"hlp", @"application/hta" : @"hta", @"application/hyperstudio" : @"stk", @"application/i-deas" : @"unv", @"application/iges" : @"iges", @"application/inf" : @"inf", @"application/inkml+xml" : @"ink", @"application/internet-property-stream" : @"acx", @"application/ipfix" : @"ipfix", @"application/java" : @"class", @"application/java-archive" : @"jar", @"application/java-byte-code" : @"class", @"application/java-serialized-object" : @"ser", @"application/java-vm" : @"class", @"application/javascript" : @"js", @"application/json" : @"json", @"application/jsonml+json" : @"jsonml", @"application/lha" : @"lha", @"application/lost+xml" : @"lostxml", @"application/lzx" : @"lzx", @"application/mac-binary" : @"bin", @"application/mac-binhex" : @"hqx", @"application/mac-binhex40" : @"hqx", @"application/mac-compactpro" : @"cpt", @"application/macbinary" : @"bin", @"application/mads+xml" : @"mads", @"application/marc" : @"mrc", @"application/marcxml+xml" : @"mrcx", @"application/mathematica" : @"ma", @"application/mathml+xml" : @"mathml", @"application/mbedlet" : @"mbd", @"application/mbox" : @"mbox", @"application/mcad" : @"mcd", @"application/mediaservercontrol+xml" : @"mscml", @"application/metalink+xml" : @"metalink", @"application/metalink4+xml" : @"meta4", @"application/mets+xml" : @"mets", @"application/mime" : @"aps", @"application/mods+xml" : @"mods", @"application/mp21" : @"m21", @"application/mp4" : @"mp4", @"application/mspowerpoint" : @"ppt", @"application/msword" : @"doc", @"application/mswrite" : @"wri", @"application/mxf" : @"mxf", @"application/netmc" : @"mcp", @"application/octet-stream" : @"bin", @"application/oda" : @"oda", @"application/oebps-package+xml" : @"opf", @"application/ogg" : @"oga", @"application/olescript" : @"axs", @"application/omdoc+xml" : @"omdoc", @"application/onenote" : @"onetoc", @"application/oxps" : @"oxps", @"application/patch-ops-error+xml" : @"xer", @"application/pdf" : @"pdf", @"application/pgp-encrypted" : @"pgp", @"application/pgp-signature" : @"sig", @"application/pics-rules" : @"prf", @"application/pkcs-12" : @"p12", @"application/pkcs-crl" : @"crl", @"application/pkcs10" : @"p10", @"application/pkcs7-mime" : @"p7m", @"application/pkcs7-signature" : @"p7s", @"application/pkcs8" : @"p8", @"application/pkix-attr-cert" : @"ac", @"application/pkix-cert" : @"cer", @"application/pkix-crl" : @"crl", @"application/pkix-pkipath" : @"pkipath", @"application/pkixcmp" : @"pki", @"application/plain" : @"text", @"application/pls+xml" : @"pls", @"application/postscript" : @"ps", @"application/powerpoint" : @"ppt", @"application/prs.cww" : @"cww", @"application/pskc+xml" : @"pskcxml", @"application/rdf+xml" : @"rdf", @"application/reginfo+xml" : @"rif", @"application/relax-ng-compact-syntax" : @"rnc", @"application/resource-lists+xml" : @"rl", @"application/resource-lists-diff+xml" : @"rld", @"application/ringing-tones" : @"rng", @"application/rls-services+xml" : @"rs", @"application/rpki-ghostbusters" : @"gbr", @"application/rpki-manifest" : @"mft", @"application/rpki-roa" : @"roa", @"application/rsd+xml" : @"rsd", @"application/rss+xml" : @"rss", @"application/rtf" : @"rtf", @"application/sbml+xml" : @"sbml", @"application/scvp-cv-request" : @"scq", @"application/scvp-cv-response" : @"scs", @"application/scvp-vp-request" : @"spq", @"application/scvp-vp-response" : @"spp", @"application/sdp" : @"sdp", @"application/sea" : @"sea", @"application/set" : @"set", @"application/set-payment-initiation" : @"setpay", @"application/set-registration-initiation" : @"setreg", @"application/shf+xml" : @"shf", @"application/sla" : @"stl", @"application/smil" : @"smi", @"application/smil+xml" : @"smi", @"application/solids" : @"sol", @"application/sounder" : @"sdr", @"application/sparql-query" : @"rq", @"application/sparql-results+xml" : @"srx", @"application/srgs" : @"gram", @"application/srgs+xml" : @"grxml", @"application/sru+xml" : @"sru", @"application/ssdl+xml" : @"ssdl", @"application/ssml+xml" : @"ssml", @"application/step" : @"step", @"application/streamingmedia" : @"ssm", @"application/tei+xml" : @"tei", @"application/thraud+xml" : @"tfi", @"application/timestamped-data" : @"tsd", @"application/toolbook" : @"tbk", @"application/vda" : @"vda", @"application/vnd.3gpp.pic-bw-large" : @"plb", @"application/vnd.3gpp.pic-bw-small" : @"psb", @"application/vnd.3gpp.pic-bw-var" : @"pvb", @"application/vnd.3gpp2.tcap" : @"tcap", @"application/vnd.3m.post-it-notes" : @"pwn", @"application/vnd.accpac.simply.aso" : @"aso", @"application/vnd.accpac.simply.imp" : @"imp", @"application/vnd.acucobol" : @"acu", @"application/vnd.acucorp" : @"atc", @"application/vnd.adobe.air-application-installer-package+zip" : @"air", @"application/vnd.adobe.formscentral.fcdt" : @"fcdt", @"application/vnd.adobe.fxp" : @"fxp", @"application/vnd.adobe.xdp+xml" : @"xdp", @"application/vnd.adobe.xfdf" : @"xfdf", @"application/vnd.ahead.space" : @"ahead", @"application/vnd.airzip.filesecure.azf" : @"azf", @"application/vnd.airzip.filesecure.azs" : @"azs", @"application/vnd.amazon.ebook" : @"azw", @"application/vnd.americandynamics.acc" : @"acc", @"application/vnd.amiga.ami" : @"ami", @"application/vnd.android.package-archive" : @"apk", @"application/vnd.anser-web-certificate-issue-initiation" : @"cii", @"application/vnd.anser-web-funds-transfer-initiation" : @"fti", @"application/vnd.antix.game-component" : @"atx", @"application/vnd.apple.installer+xml" : @"mpkg", @"application/vnd.apple.mpegurl" : @"m3u8", @"application/vnd.aristanetworks.swi" : @"swi", @"application/vnd.astraea-software.iota" : @"iota", @"application/vnd.audiograph" : @"aep", @"application/vnd.blueice.multipass" : @"mpm", @"application/vnd.bmi" : @"bmi", @"application/vnd.businessobjects" : @"rep", @"application/vnd.chemdraw+xml" : @"cdxml", @"application/vnd.chipnuts.karaoke-mmd" : @"mmd", @"application/vnd.cinderella" : @"cdy", @"application/vnd.claymore" : @"cla", @"application/vnd.cloanto.rp9" : @"rp9", @"application/vnd.clonk.c4group" : @"c4g", @"application/vnd.cluetrust.cartomobile-config" : @"c11amc", @"application/vnd.cluetrust.cartomobile-config-pkg" : @"c11amz", @"application/vnd.commonspace" : @"csp", @"application/vnd.contact.cmsg" : @"cdbcmsg", @"application/vnd.cosmocaller" : @"cmc", @"application/vnd.crick.clicker" : @"clkx", @"application/vnd.crick.clicker.keyboard" : @"clkk", @"application/vnd.crick.clicker.palette" : @"clkp", @"application/vnd.crick.clicker.template" : @"clkt", @"application/vnd.crick.clicker.wordbank" : @"clkw", @"application/vnd.criticaltools.wbs+xml" : @"wbs", @"application/vnd.ctc-posml" : @"pml", @"application/vnd.cups-ppd" : @"ppd", @"application/vnd.curl.car" : @"car", @"application/vnd.curl.pcurl" : @"pcurl", @"application/vnd.dart" : @"dart", @"application/vnd.data-vision.rdz" : @"rdz", @"application/vnd.dece.data" : @"uvf", @"application/vnd.dece.ttml+xml" : @"uvt", @"application/vnd.dece.unspecified" : @"uvx", @"application/vnd.dece.zip" : @"uvz", @"application/vnd.denovo.fcselayout-link" : @"fe_launch", @"application/vnd.dna" : @"dna", @"application/vnd.dolby.mlp" : @"mlp", @"application/vnd.dpgraph" : @"dpg", @"application/vnd.dreamfactory" : @"dfac", @"application/vnd.ds-keypoint" : @"kpxx", @"application/vnd.dvb.ait" : @"ait", @"application/vnd.dvb.service" : @"svc", @"application/vnd.dynageo" : @"geo", @"application/vnd.ecowin.chart" : @"mag", @"application/vnd.enliven" : @"nml", @"application/vnd.epson.esf" : @"esf", @"application/vnd.epson.msf" : @"msf", @"application/vnd.epson.quickanime" : @"qam", @"application/vnd.epson.salt" : @"slt", @"application/vnd.epson.ssf" : @"ssf", @"application/vnd.eszigno3+xml" : @"es3", @"application/vnd.ezpix-album" : @"ez2", @"application/vnd.ezpix-package" : @"ez3", @"application/vnd.fdf" : @"fdf", @"application/vnd.fdsn.mseed" : @"mseed", @"application/vnd.fdsn.seed" : @"seed", @"application/vnd.flographit" : @"gph", @"application/vnd.fluxtime.clip" : @"ftc", @"application/vnd.framemaker" : @"fm", @"application/vnd.frogans.fnc" : @"fnc", @"application/vnd.frogans.ltf" : @"ltf", @"application/vnd.fsc.weblaunch" : @"fsc", @"application/vnd.fujitsu.oasys" : @"oas", @"application/vnd.fujitsu.oasys2" : @"oa2", @"application/vnd.fujitsu.oasys3" : @"oa3", @"application/vnd.fujitsu.oasysgp" : @"fg5", @"application/vnd.fujitsu.oasysprs" : @"bh2", @"application/vnd.fujixerox.ddd" : @"ddd", @"application/vnd.fujixerox.docuworks" : @"xdw", @"application/vnd.fujixerox.docuworks.binder" : @"xbd", @"application/vnd.fuzzysheet" : @"fzs", @"application/vnd.genomatix.tuxedo" : @"txd", @"application/vnd.geogebra.file" : @"ggb", @"application/vnd.geogebra.tool" : @"ggt", @"application/vnd.geometry-explorer" : @"gex", @"application/vnd.geonext" : @"gxt", @"application/vnd.geoplan" : @"g2w", @"application/vnd.geospace" : @"g3w", @"application/vnd.gmx" : @"gmx", @"application/vnd.google-earth.kml+xml" : @"kml", @"application/vnd.google-earth.kmz" : @"kmz", @"application/vnd.grafeq" : @"gqf", @"application/vnd.groove-account" : @"gac", @"application/vnd.groove-help" : @"ghf", @"application/vnd.groove-identity-message" : @"gim", @"application/vnd.groove-injector" : @"grv", @"application/vnd.groove-tool-message" : @"gtm", @"application/vnd.groove-tool-template" : @"tpl", @"application/vnd.groove-vcard" : @"vcg", @"application/vnd.hal+xml" : @"hal", @"application/vnd.handheld-entertainment+xml" : @"zmm", @"application/vnd.hbci" : @"hbci", @"application/vnd.hhe.lesson-player" : @"les", @"application/vnd.hp-hpgl" : @"hpgl", @"application/vnd.hp-hpid" : @"hpid", @"application/vnd.hp-hps" : @"hps", @"application/vnd.hp-jlyt" : @"jlt", @"application/vnd.hp-pcl" : @"pcl", @"application/vnd.hp-pclxl" : @"pclxl", @"application/vnd.hydrostatix.sof-data" : @"sfd-hdstx", @"application/vnd.ibm.minipay" : @"mpy", @"application/vnd.ibm.modcap" : @"afp", @"application/vnd.ibm.rights-management" : @"irm", @"application/vnd.ibm.secure-container" : @"sc", @"application/vnd.iccprofile" : @"icc", @"application/vnd.igloader" : @"igl", @"application/vnd.immervision-ivp" : @"ivp", @"application/vnd.immervision-ivu" : @"ivu", @"application/vnd.insors.igm" : @"igm", @"application/vnd.intercon.formnet" : @"xpw", @"application/vnd.intergeo" : @"i2g", @"application/vnd.intu.qbo" : @"qbo", @"application/vnd.intu.qfx" : @"qfx", @"application/vnd.ipunplugged.rcprofile" : @"rcprofile", @"application/vnd.irepository.package+xml" : @"irp", @"application/vnd.is-xpr" : @"xpr", @"application/vnd.isac.fcs" : @"fcs", @"application/vnd.jam" : @"jam", @"application/vnd.jcp.javame.midlet-rms" : @"rms", @"application/vnd.jisp" : @"jisp", @"application/vnd.joost.joda-archive" : @"joda", @"application/vnd.kahootz" : @"ktz", @"application/vnd.kde.karbon" : @"karbon", @"application/vnd.kde.kchart" : @"chrt", @"application/vnd.kde.kformula" : @"kfo", @"application/vnd.kde.kivio" : @"flw", @"application/vnd.kde.kontour" : @"kon", @"application/vnd.kde.kpresenter" : @"kpr", @"application/vnd.kde.kspread" : @"ksp", @"application/vnd.kde.kword" : @"kwd", @"application/vnd.kenameaapp" : @"htke", @"application/vnd.kidspiration" : @"kia", @"application/vnd.kinar" : @"kne", @"application/vnd.koan" : @"skp", @"application/vnd.kodak-descriptor" : @"sse", @"application/vnd.las.las+xml" : @"lasxml", @"application/vnd.llamagraphics.life-balance.desktop" : @"lbd", @"application/vnd.llamagraphics.life-balance.exchange+xml" : @"lbe", @"application/vnd.lotus-1-2-3" : @"123", @"application/vnd.lotus-approach" : @"apr", @"application/vnd.lotus-freelance" : @"pre", @"application/vnd.lotus-notes" : @"nsf", @"application/vnd.lotus-organizer" : @"org", @"application/vnd.lotus-screencam" : @"scm", @"application/vnd.lotus-wordpro" : @"lwp", @"application/vnd.macports.portpkg" : @"portpkg", @"application/vnd.mcd" : @"mcd", @"application/vnd.medcalcdata" : @"mc1", @"application/vnd.mediastation.cdkey" : @"cdkey", @"application/vnd.mfer" : @"mwf", @"application/vnd.mfmp" : @"mfm", @"application/vnd.micrografx.flo" : @"flo", @"application/vnd.micrografx.igx" : @"igx", @"application/vnd.mif" : @"mif", @"application/vnd.mobius.daf" : @"daf", @"application/vnd.mobius.dis" : @"dis", @"application/vnd.mobius.mbk" : @"mbk", @"application/vnd.mobius.mqy" : @"mqy", @"application/vnd.mobius.msl" : @"msl", @"application/vnd.mobius.plc" : @"plc", @"application/vnd.mobius.txf" : @"txf", @"application/vnd.mophun.application" : @"mpn", @"application/vnd.mophun.certificate" : @"mpc", @"application/vnd.mozilla.xul+xml" : @"xul", @"application/vnd.ms-artgalry" : @"cil", @"application/vnd.ms-cab-compressed" : @"cab", @"application/vnd.ms-excel" : @"xls", @"application/vnd.ms-excel.addin.macroenabled.12" : @"xlam", @"application/vnd.ms-excel.sheet.binary.macroenabled.12" : @"xlsb", @"application/vnd.ms-excel.sheet.macroenabled.12" : @"xlsm", @"application/vnd.ms-excel.template.macroenabled.12" : @"xltm", @"application/vnd.ms-fontobject" : @"eot", @"application/vnd.ms-htmlhelp" : @"chm", @"application/vnd.ms-ims" : @"ims", @"application/vnd.ms-lrm" : @"lrm", @"application/vnd.ms-officetheme" : @"thmx", @"application/vnd.ms-outlook" : @"msg", @"application/vnd.ms-pki.certstore" : @"sst", @"application/vnd.ms-pki.pko" : @"pko", @"application/vnd.ms-pki.seccat" : @"cat", @"application/vnd.ms-pki.stl" : @"stl", @"application/vnd.ms-pkicertstore" : @"sst", @"application/vnd.ms-pkiseccat" : @"cat", @"application/vnd.ms-pkistl" : @"stl", @"application/vnd.ms-powerpoint" : @"ppt", @"application/vnd.ms-powerpoint.addin.macroenabled.12" : @"ppam", @"application/vnd.ms-powerpoint.presentation.macroenabled.12" : @"pptm", @"application/vnd.ms-powerpoint.slide.macroenabled.12" : @"sldm", @"application/vnd.ms-powerpoint.slideshow.macroenabled.12" : @"ppsm", @"application/vnd.ms-powerpoint.template.macroenabled.12" : @"potm", @"application/vnd.ms-project" : @"mpp", @"application/vnd.ms-word.document.macroenabled.12" : @"docm", @"application/vnd.ms-word.template.macroenabled.12" : @"dotm", @"application/vnd.ms-works" : @"wps", @"application/vnd.ms-wpl" : @"wpl", @"application/vnd.ms-xpsdocument" : @"xps", @"application/vnd.mseq" : @"mseq", @"application/vnd.musician" : @"mus", @"application/vnd.muvee.style" : @"msty", @"application/vnd.mynfc" : @"taglet", @"application/vnd.neurolanguage.nlu" : @"nlu", @"application/vnd.nitf" : @"ntf", @"application/vnd.noblenet-directory" : @"nnd", @"application/vnd.noblenet-sealer" : @"nns", @"application/vnd.noblenet-web" : @"nnw", @"application/vnd.nokia.configuration-message" : @"ncm", @"application/vnd.nokia.n-gage.data" : @"ngdat", @"application/vnd.nokia.n-gage.symbian.install" : @"n-gage", @"application/vnd.nokia.radio-preset" : @"rpst", @"application/vnd.nokia.radio-presets" : @"rpss", @"application/vnd.nokia.ringing-tone" : @"rng", @"application/vnd.novadigm.edm" : @"edm", @"application/vnd.novadigm.edx" : @"edx", @"application/vnd.novadigm.ext" : @"ext", @"application/vnd.oasis.opendocument.chart" : @"odc", @"application/vnd.oasis.opendocument.chart-template" : @"otc", @"application/vnd.oasis.opendocument.database" : @"odb", @"application/vnd.oasis.opendocument.formula" : @"odf", @"application/vnd.oasis.opendocument.formula-template" : @"odft", @"application/vnd.oasis.opendocument.graphics" : @"odg", @"application/vnd.oasis.opendocument.graphics-template" : @"otg", @"application/vnd.oasis.opendocument.image" : @"odi", @"application/vnd.oasis.opendocument.image-template" : @"oti", @"application/vnd.oasis.opendocument.presentation" : @"odp", @"application/vnd.oasis.opendocument.presentation-template" : @"otp", @"application/vnd.oasis.opendocument.spreadsheet" : @"ods", @"application/vnd.oasis.opendocument.spreadsheet-template" : @"ots", @"application/vnd.oasis.opendocument.text" : @"odt", @"application/vnd.oasis.opendocument.text-master" : @"odm", @"application/vnd.oasis.opendocument.text-template" : @"ott", @"application/vnd.oasis.opendocument.text-web" : @"oth", @"application/vnd.olpc-sugar" : @"xo", @"application/vnd.oma.dd2+xml" : @"dd2", @"application/vnd.openofficeorg.extension" : @"oxt", @"application/vnd.openxmlformats-officedocument.presentationml.presentation" : @"pptx", @"application/vnd.openxmlformats-officedocument.presentationml.slide" : @"sldx", @"application/vnd.openxmlformats-officedocument.presentationml.slideshow" : @"ppsx", @"application/vnd.openxmlformats-officedocument.presentationml.template" : @"potx", @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" : @"xlsx", @"application/vnd.openxmlformats-officedocument.spreadsheetml.template" : @"xltx", @"application/vnd.openxmlformats-officedocument.wordprocessingml.document" : @"docx", @"application/vnd.openxmlformats-officedocument.wordprocessingml.template" : @"dotx", @"application/vnd.osgeo.mapguide.package" : @"mgp", @"application/vnd.osgi.dp" : @"dp", @"application/vnd.osgi.subsystem" : @"esa", @"application/vnd.palm" : @"pdb", @"application/vnd.pawaafile" : @"paw", @"application/vnd.pg.format" : @"str", @"application/vnd.pg.osasli" : @"ei6", @"application/vnd.picsel" : @"efif", @"application/vnd.pmi.widget" : @"wg", @"application/vnd.pocketlearn" : @"plf", @"application/vnd.powerbuilder6" : @"pbd", @"application/vnd.previewsystems.box" : @"box", @"application/vnd.proteus.magazine" : @"mgz", @"application/vnd.publishare-delta-tree" : @"qps", @"application/vnd.pvi.ptid1" : @"ptid", @"application/vnd.quark.quarkxpress" : @"qxd", @"application/vnd.realvnc.bed" : @"bed", @"application/vnd.recordare.musicxml" : @"mxl", @"application/vnd.recordare.musicxml+xml" : @"musicxml", @"application/vnd.rig.cryptonote" : @"cryptonote", @"application/vnd.rim.cod" : @"cod", @"application/vnd.rn-realmedia" : @"rm", @"application/vnd.rn-realmedia-vbr" : @"rmvb", @"application/vnd.rn-realplayer" : @"rnx", @"application/vnd.route66.link66+xml" : @"link66", @"application/vnd.sailingtracker.track" : @"st", @"application/vnd.seemail" : @"see", @"application/vnd.sema" : @"sema", @"application/vnd.semd" : @"semd", @"application/vnd.semf" : @"semf", @"application/vnd.shana.informed.formdata" : @"ifm", @"application/vnd.shana.informed.formtemplate" : @"itp", @"application/vnd.shana.informed.interchange" : @"iif", @"application/vnd.shana.informed.package" : @"ipk", @"application/vnd.simtech-mindmapper" : @"twd", @"application/vnd.smaf" : @"mmf", @"application/vnd.smart.teacher" : @"teacher", @"application/vnd.solent.sdkm+xml" : @"sdkm", @"application/vnd.spotfire.dxp" : @"dxp", @"application/vnd.spotfire.sfs" : @"sfs", @"application/vnd.stardivision.calc" : @"sdc", @"application/vnd.stardivision.draw" : @"sda", @"application/vnd.stardivision.impress" : @"sdd", @"application/vnd.stardivision.math" : @"smf", @"application/vnd.stardivision.writer" : @"sdw", @"application/vnd.stardivision.writer-global" : @"sgl", @"application/vnd.stepmania.package" : @"smzip", @"application/vnd.stepmania.stepchart" : @"sm", @"application/vnd.sun.xml.calc" : @"sxc", @"application/vnd.sun.xml.calc.template" : @"stc", @"application/vnd.sun.xml.draw" : @"sxd", @"application/vnd.sun.xml.draw.template" : @"std", @"application/vnd.sun.xml.impress" : @"sxi", @"application/vnd.sun.xml.impress.template" : @"sti", @"application/vnd.sun.xml.math" : @"sxm", @"application/vnd.sun.xml.writer" : @"sxw", @"application/vnd.sun.xml.writer.global" : @"sxg", @"application/vnd.sun.xml.writer.template" : @"stw", @"application/vnd.sus-calendar" : @"sus", @"application/vnd.svd" : @"svd", @"application/vnd.symbian.install" : @"sis", @"application/vnd.syncml+xml" : @"xsm", @"application/vnd.syncml.dm+wbxml" : @"bdm", @"application/vnd.syncml.dm+xml" : @"xdm", @"application/vnd.tao.intent-module-archive" : @"tao", @"application/vnd.tcpdump.pcap" : @"pcap", @"application/vnd.tmobile-livetv" : @"tmo", @"application/vnd.trid.tpt" : @"tpt", @"application/vnd.triscape.mxs" : @"mxs", @"application/vnd.trueapp" : @"tra", @"application/vnd.ufdl" : @"ufd", @"application/vnd.uiq.theme" : @"utz", @"application/vnd.umajin" : @"umj", @"application/vnd.unity" : @"unityweb", @"application/vnd.uoml+xml" : @"uoml", @"application/vnd.vcx" : @"vcx", @"application/vnd.visio" : @"vsd", @"application/vnd.visio2013" : @"vsdx", @"application/vnd.visionary" : @"vis", @"application/vnd.vsf" : @"vsf", @"application/vnd.wap.wbxml" : @"wbxml", @"application/vnd.wap.wmlc" : @"wmlc", @"application/vnd.wap.wmlscriptc" : @"wmlsc", @"application/vnd.webturbo" : @"wtb", @"application/vnd.wolfram.player" : @"nbp", @"application/vnd.wordperfect" : @"wpd", @"application/vnd.wqd" : @"wqd", @"application/vnd.wt.stf" : @"stf", @"application/vnd.xara" : @"xar", @"application/vnd.xfdl" : @"xfdl", @"application/vnd.yamaha.hv-dic" : @"hvd", @"application/vnd.yamaha.hv-script" : @"hvs", @"application/vnd.yamaha.hv-voice" : @"hvp", @"application/vnd.yamaha.openscoreformat" : @"osf", @"application/vnd.yamaha.openscoreformat.osfpvg+xml" : @"osfpvg", @"application/vnd.yamaha.smaf-audio" : @"saf", @"application/vnd.yamaha.smaf-phrase" : @"spf", @"application/vnd.yellowriver-custom-menu" : @"cmp", @"application/vnd.zul" : @"zir", @"application/vnd.zzazz.deck+xml" : @"zaz", @"application/vocaltec-media-desc" : @"vmd", @"application/vocaltec-media-file" : @"vmf", @"application/voicexml+xml" : @"vxml", @"application/widget" : @"wgt", @"application/winhlp" : @"hlp", @"application/wordperfect" : @"wp", @"application/wordperfect6.0" : @"w60", @"application/wordperfect6.1" : @"w61", @"application/wsdl+xml" : @"wsdl", @"application/wspolicy+xml" : @"wspolicy", @"application/x-123" : @"wk1", @"application/x-7z-compressed" : @"7z", @"application/x-abiword" : @"abw", @"application/x-ace-compressed" : @"ace", @"application/x-aim" : @"aim", @"application/x-apple-diskimage" : @"dmg", @"application/x-authorware-bin" : @"aab", @"application/x-authorware-map" : @"aam", @"application/x-authorware-seg" : @"aas", @"application/x-bcpio" : @"bcpio", @"application/x-binary" : @"bin", @"application/x-binhex40" : @"hqx", @"application/x-bittorrent" : @"torrent", @"application/x-blorb" : @"blb", @"application/x-bsh" : @"sh", @"application/x-bytecode.elisp" : @"elc", @"application/x-bytecode.python" : @"pyc", @"application/x-bzip" : @"bz", @"application/x-bzip2" : @"bz2", @"application/x-cbr" : @"cbr", @"application/x-cdf" : @"cdf", @"application/x-cdlink" : @"vcd", @"application/x-cfs-compressed" : @"cfs", @"application/x-chat" : @"chat", @"application/x-chess-pgn" : @"pgn", @"application/x-cmu-raster" : @"ras", @"application/x-cocoa" : @"cco", @"application/x-compactpro" : @"cpt", @"application/x-compress" : @"z", @"application/x-conference" : @"nsc", @"application/x-cpio" : @"cpio", @"application/x-cpt" : @"cpt", @"application/x-csh" : @"csh", @"application/x-debian-package" : @"deb", @"application/x-deepv" : @"deepv", @"application/x-dgc-compressed" : @"dgc", @"application/x-director" : @"dir", @"application/x-doom" : @"wad", @"application/x-dtbncx+xml" : @"ncx", @"application/x-dtbook+xml" : @"dtb", @"application/x-dtbresource+xml" : @"res", @"application/x-dvi" : @"dvi", @"application/x-elc" : @"elc", @"application/x-envoy" : @"evy", @"application/x-esrehber" : @"es", @"application/x-eva" : @"eva", @"application/x-excel" : @"xls", @"application/x-font-bdf" : @"bdf", @"application/x-font-ghostscript" : @"gsf", @"application/x-font-linux-psf" : @"psf", @"application/x-font-otf" : @"otf", @"application/x-font-pcf" : @"pcf", @"application/x-font-snf" : @"snf", @"application/x-font-ttf" : @"ttf", @"application/x-font-type1" : @"pfa", @"application/x-font-woff" : @"woff", @"application/x-frame" : @"mif", @"application/x-freearc" : @"arc", @"application/x-freelance" : @"pre", @"application/x-futuresplash" : @"spl", @"application/x-gca-compressed" : @"gca", @"application/x-glulx" : @"ulx", @"application/x-gnumeric" : @"gnumeric", @"application/x-gramps-xml" : @"gramps", @"application/x-gsp" : @"gsp", @"application/x-gss" : @"gss", @"application/x-gtar" : @"gtar", @"application/x-gzip" : @"gz", @"application/x-hdf" : @"hdf", @"application/x-httpd-imap" : @"imap", @"application/x-ima" : @"ima", @"application/x-install-instructions" : @"install", @"application/x-internett-signup" : @"ins", @"application/x-inventor" : @"iv", @"application/x-ip2" : @"ip", @"application/x-iphone" : @"iii", @"application/x-iso9660-image" : @"iso", @"application/x-java-class" : @"class", @"application/x-java-commerce" : @"jcm", @"application/x-java-jnlp-file" : @"jnlp", @"application/x-javascript" : @"js", @"application/x-ksh" : @"ksh", @"application/x-latex" : @"ltx", @"application/x-lha" : @"lha", @"application/x-lisp" : @"lsp", @"application/x-livescreen" : @"ivy", @"application/x-lotus" : @"wq1", @"application/x-lotusscreencam" : @"scm", @"application/x-lzh" : @"lzh", @"application/x-lzh-compressed" : @"lzh", @"application/x-lzx" : @"lzx", @"application/x-mac-binhex40" : @"hqx", @"application/x-macbinary" : @"bin", @"application/x-magic-cap-package-1.0" : @"mc$", @"application/x-mathcad" : @"mcd", @"application/x-meme" : @"mm", @"application/x-midi" : @"midi", @"application/x-mie" : @"mie", @"application/x-mif" : @"mif", @"application/x-mix-transfer" : @"nix", @"application/x-mobipocket-ebook" : @"prc", @"application/x-mplayer2" : @"asx", @"application/x-ms-application" : @"application", @"application/x-ms-shortcut" : @"lnk", @"application/x-ms-wmd" : @"wmd", @"application/x-ms-wmz" : @"wmz", @"application/x-ms-xbap" : @"xbap", @"application/x-msaccess" : @"mdb", @"application/x-msbinder" : @"obd", @"application/x-mscardfile" : @"crd", @"application/x-msclip" : @"clp", @"application/x-msdownload" : @"exe", @"application/x-msexcel" : @"xls", @"application/x-msmediaview" : @"mvb", @"application/x-msmetafile" : @"wmf", @"application/x-msmoney" : @"mny", @"application/x-mspowerpoint" : @"ppt", @"application/x-mspublisher" : @"pub", @"application/x-msschedule" : @"scd", @"application/x-msterminal" : @"trm", @"application/x-mswrite" : @"wri", @"application/x-navi-animation" : @"ani", @"application/x-navidoc" : @"nvd", @"application/x-navimap" : @"map", @"application/x-navistyle" : @"stl", @"application/x-netcdf" : @"nc", @"application/x-newton-compatible-pkg" : @"pkg", @"application/x-nokia-9000-communicator-add-on-software" : @"aos", @"application/x-nzb" : @"nzb", @"application/x-omc" : @"omc", @"application/x-omcdatamaker" : @"omcd", @"application/x-omcregerator" : @"omcr", @"application/x-pcl" : @"pcl", @"application/x-pixclscript" : @"plx", @"application/x-pkcs10" : @"p10", @"application/x-pkcs12" : @"p12", @"application/x-pkcs7-certificates" : @"p7b", @"application/x-pkcs7-certreqresp" : @"p7r", @"application/x-pkcs7-mime" : @"p7m", @"application/x-pkcs7-signature" : @"p7s", @"application/x-pointplus" : @"css", @"application/x-portable-anymap" : @"pnm", @"application/x-qpro" : @"wb1", @"application/x-rar-compressed" : @"rar", @"application/x-research-info-systems" : @"ris", @"application/x-rtf" : @"rtf", @"application/x-sdp" : @"sdp", @"application/x-sea" : @"sea", @"application/x-seelogo" : @"sl", @"application/x-sh" : @"sh", @"application/x-shar" : @"shar", @"application/x-shockwave-flash" : @"swf", @"application/x-silverlight-app" : @"xap", @"application/x-sit" : @"sit", @"application/x-sprite" : @"spr", @"application/x-sql" : @"sql", @"application/x-stuffit" : @"sit", @"application/x-stuffitx" : @"sitx", @"application/x-subrip" : @"srt", @"application/x-sv4cpio" : @"sv4cpio", @"application/x-sv4crc" : @"sv4crc", @"application/x-t3vm-image" : @"t3", @"application/x-tads" : @"gam", @"application/x-tar" : @"tar", @"application/x-tbook" : @"tbk", @"application/x-tcl" : @"tcl", @"application/x-tex" : @"tex", @"application/x-tex-tfm" : @"tfm", @"application/x-texinfo" : @"texinfo", @"application/x-tgif" : @"obj", @"application/x-troff-man" : @"man", @"application/x-troff-me" : @"me", @"application/x-troff-ms" : @"ms", @"application/x-troff-msvideo" : @"avi", @"application/x-ustar" : @"ustar", @"application/x-visio" : @"vsd", @"application/x-vnd.audioexplosion.mzz" : @"mzz", @"application/x-vnd.ls-xpix" : @"xpix", @"application/x-vrml" : @"vrml", @"application/x-wais-source" : @"src", @"application/x-winhelp" : @"hlp", @"application/x-wintalk" : @"wtk", @"application/x-wpwin" : @"wpd", @"application/x-wri" : @"wri", @"application/x-x509-ca-cert" : @"crt", @"application/x-x509-user-cert" : @"crt", @"application/x-xfig" : @"fig", @"application/x-xliff+xml" : @"xlf", @"application/x-xpinstall" : @"xpi", @"application/x-xz" : @"xz", @"application/x-zip-compressed" : @"zip", @"application/x-zmachine" : @"z1", @"application/xaml+xml" : @"xaml", @"application/xcap-diff+xml" : @"xdf", @"application/xenc+xml" : @"xenc", @"application/xhtml+xml" : @"xhtml", @"application/xml" : @"xml", @"application/xml-dtd" : @"dtd", @"application/xop+xml" : @"xop", @"application/xproc+xml" : @"xpl", @"application/xslt+xml" : @"xslt", @"application/xspf+xml" : @"xspf", @"application/xv+xml" : @"mxml", @"application/yang" : @"yang", @"application/yin+xml" : @"yin", @"application/ynd.ms-pkipko" : @"pko", OWSMimeTypeApplicationZip : @"zip", @"audio/aac" : @"aac", @"audio/adpcm" : @"adp", @"audio/aiff" : @"aiff", @"audio/basic" : @"au", @"audio/it" : @"it", @"audio/mid" : @"rmi", @"audio/midi" : @"midi", @"audio/mod" : @"mod", @"audio/mp4" : @"m4a", @"audio/mpeg" : @"mpg", @"audio/mpeg3" : @"mp3", @"audio/ogg" : @"oga", @"audio/s3m" : @"s3m", @"audio/silk" : @"sil", @"audio/tsp-audio" : @"tsi", @"audio/tsplayer" : @"tsp", @"audio/vnd.dece.audio" : @"uva", @"audio/vnd.digital-winds" : @"eol", @"audio/vnd.dra" : @"dra", @"audio/vnd.dts" : @"dts", @"audio/vnd.dts.hd" : @"dtshd", @"audio/vnd.lucent.voice" : @"lvp", @"audio/vnd.ms-playready.media.pya" : @"pya", @"audio/vnd.nuera.ecelp4800" : @"ecelp4800", @"audio/vnd.nuera.ecelp7470" : @"ecelp7470", @"audio/vnd.nuera.ecelp9600" : @"ecelp9600", @"audio/vnd.qcelp" : @"qcp", @"audio/vnd.rip" : @"rip", @"audio/voc" : @"voc", @"audio/voxware" : @"vox", @"audio/wav" : @"wav", @"audio/webm" : @"weba", @"audio/x-aac" : @"aac", @"audio/x-adpcm" : @"snd", @"audio/x-aiff" : @"aiff", @"audio/x-au" : @"au", @"audio/x-caf" : @"caf", @"audio/x-flac" : @"flac", @"audio/x-gsm" : @"gsm", @"audio/x-jam" : @"jam", @"audio/x-liveaudio" : @"lam", @"audio/x-matroska" : @"mka", @"audio/x-mid" : @"midi", @"audio/x-midi" : @"midi", @"audio/x-mod" : @"mod", @"audio/x-mpeg" : @"mp2", @"audio/x-mpeg-3" : @"mp3", @"audio/x-mpegurl" : @"m3u", @"audio/x-mpequrl" : @"m3u", @"audio/x-ms-wax" : @"wax", @"audio/x-ms-wma" : @"wma", @"audio/x-pn-realaudio" : @"ram", @"audio/x-pn-realaudio-plugin" : @"rmp", @"audio/x-psid" : @"sid", @"audio/x-realaudio" : @"ra", @"audio/x-twinvq" : @"vqf", @"audio/x-vnd.audioexplosion.mjuicemediafile" : @"mjf", @"audio/x-voc" : @"voc", @"audio/x-wav" : @"wav", @"audio/xm" : @"xm", @"chemical/x-cdx" : @"cdx", @"chemical/x-cif" : @"cif", @"chemical/x-cmdf" : @"cmdf", @"chemical/x-cml" : @"cml", @"chemical/x-csml" : @"csml", @"chemical/x-pdb" : @"pdb", @"chemical/x-xyz" : @"xyz", @"drawing/x-dwf" : @"dwf", @"font/ttf" : @"ttf", @"font/woff" : @"woff", @"font/woff2" : @"woff2", @"i-world/i-vrml" : @"ivr", @"image/bmp" : @"bmp", @"image/cgm" : @"cgm", @"image/cis-cod" : @"cod", @"image/fif" : @"fif", @"image/g3fax" : @"g3", @"image/gif" : @"gif", @"image/heic" : @"heic", @"image/heif" : @"heif", @"image/ief" : @"ief", @"image/jpeg" : @"jpg", @"image/jutvision" : @"jut", @"image/ktx" : @"ktx", @"image/pict" : @"pict", @"image/pjpeg" : @"jpg", @"image/png" : @"png", @"image/prs.btif" : @"btif", @"image/sgi" : @"sgi", @"image/svg+xml" : @"svg", @"image/tiff" : @"tiff", @"image/vasa" : @"mcf", @"image/vnd.adobe.photoshop" : @"psd", @"image/vnd.dece.graphic" : @"uvi", @"image/vnd.djvu" : @"djvu", @"image/vnd.dvb.subtitle" : @"sub", @"image/vnd.dwg" : @"dwg", @"image/vnd.dxf" : @"dxf", @"image/vnd.fastbidsheet" : @"fbs", @"image/vnd.fpx" : @"fpx", @"image/vnd.fst" : @"fst", @"image/vnd.fujixerox.edmics-mmr" : @"mmr", @"image/vnd.fujixerox.edmics-rlc" : @"rlc", @"image/vnd.ms-modi" : @"mdi", @"image/vnd.ms-photo" : @"wdp", @"image/vnd.net-fpx" : @"fpx", @"image/vnd.rn-realflash" : @"rf", @"image/vnd.rn-realpix" : @"rp", @"image/vnd.wap.wbmp" : @"wbmp", @"image/vnd.xiff" : @"xif", @"image/webp" : @"webp", @"image/x-3ds" : @"3ds", @"image/x-citrix-jpeg" : @"jpg", @"image/x-citrix-png" : @"png", @"image/x-cmu-raster" : @"ras", @"image/x-cmx" : @"cmx", @"image/x-dwg" : @"dwg", @"image/x-freehand" : @"fh", @"image/x-icon" : @"ico", @"image/x-jg" : @"art", @"image/x-jps" : @"jps", @"image/x-mrsid-image" : @"sid", @"image/x-niff" : @"niff", @"image/x-pcx" : @"pcx", @"image/x-pict" : @"pic", @"image/x-png" : @"png", @"image/x-portable-anymap" : @"pnm", @"image/x-portable-bitmap" : @"pbm", @"image/x-portable-graymap" : @"pgm", @"image/x-portable-greymap" : @"pgm", @"image/x-portable-pixmap" : @"ppm", @"image/x-rgb" : @"rgb", @"image/x-tga" : @"tga", @"image/x-tiff" : @"tiff", @"image/x-windows-bmp" : @"bmp", @"image/x-xbitmap" : @"xbm", @"image/x-xbm" : @"xbm", @"image/x-xpixmap" : @"xpm", @"image/x-xwd" : @"xwd", @"image/x-xwindowdump" : @"xwd", @"image/xbm" : @"xbm", @"image/xpm" : @"xpm", @"message/rfc822" : @"eml", @"model/iges" : @"iges", @"model/mesh" : @"msh", @"model/vnd.collada+xml" : @"dae", @"model/vnd.dwf" : @"dwf", @"model/vnd.gdl" : @"gdl", @"model/vnd.gtw" : @"gtw", @"model/vnd.mts" : @"mts", @"model/vnd.vtu" : @"vtu", @"model/vrml" : @"vrml", @"model/x-pov" : @"pov", @"model/x3d+binary" : @"x3db", @"model/x3d+vrml" : @"x3dv", @"model/x3d+xml" : @"x3d", @"multipart/x-gzip" : @"gzip", @"multipart/x-ustar" : @"ustar", @"multipart/x-zip" : @"zip", @"music/x-karaoke" : @"kar", @"paleovu/x-pv" : @"pvu", @"text/asp" : @"asp", @"text/cache-manifest" : @"appcache", @"text/calendar" : @"ics", @"text/css" : @"css", @"text/csv" : @"csv", @"text/ecmascript" : @"js", @"text/h323" : @"323", @"text/html" : @"html", @"text/iuls" : @"uls", @"text/java" : @"java", @"text/javascript" : @"js", @"text/mcf" : @"mcf", @"text/n3" : @"n3", @"text/pascal" : @"pas", @"text/plain" : @"txt", @"text/plain-bas" : @"par", @"text/prs.lines.logTag" : @"dsc", @"text/richtext" : @"rtf", @"text/scriplet" : @"wsc", @"text/scriptlet" : @"sct", @"text/sgml" : @"sgml", @"text/tab-separated-values" : @"tsv", @"text/troff" : @"t", @"text/turtle" : @"ttl", @"text/uri-list" : @"uri", @"text/vcard" : @"vcard", @"text/vnd.abc" : @"abc", @"text/vnd.curl" : @"curl", @"text/vnd.curl.dcurl" : @"dcurl", @"text/vnd.curl.mcurl" : @"mcurl", @"text/vnd.curl.scurl" : @"scurl", @"text/vnd.dvb.subtitle" : @"sub", @"text/vnd.fly" : @"fly", @"text/vnd.fmi.flexstor" : @"flx", @"text/vnd.graphviz" : @"gv", @"text/vnd.in3d.3dml" : @"3dml", @"text/vnd.in3d.spot" : @"spot", @"text/vnd.rn-realtext" : @"rt", @"text/vnd.sun.j2me.app-descriptor" : @"jad", @"text/vnd.wap.wml" : @"wml", @"text/vnd.wap.wmlscript" : @"wmls", @"text/webviewhtml" : @"htt", @"text/x-asm" : @"asm", @"text/x-audiosoft-intra" : @"aip", @"text/x-c" : @"c", @"text/x-component" : @"htc", @"text/x-fortran" : @"f", @"text/x-h" : @"h", @"text/x-java-source" : @"java", @"text/x-la-asf" : @"lsx", @"text/x-m" : @"m", @"text/x-nfo" : @"nfo", @"text/x-opml" : @"opml", @"text/x-pascal" : @"p", @"text/x-script" : @"hlb", @"text/x-script.csh" : @"csh", @"text/x-script.elisp" : @"el", @"text/x-script.guile" : @"scm", @"text/x-script.ksh" : @"ksh", @"text/x-script.lisp" : @"lsp", @"text/x-script.perl" : @"pl", @"text/x-script.perl-module" : @"pm", @"text/x-script.phyton" : @"py", @"text/x-script.rexx" : @"rexx", @"text/x-script.scheme" : @"scm", @"text/x-script.sh" : @"sh", @"text/x-script.tcl" : @"tcl", @"text/x-script.tcsh" : @"tcsh", @"text/x-script.zsh" : @"zsh", @"text/x-setext" : @"etx", @"text/x-sfv" : @"sfv", @"text/x-sgml" : @"sgml", @"text/x-uil" : @"uil", @"text/x-uuencode" : @"uu", @"text/x-vcalendar" : @"vcs", @"text/x-vcard" : @"vcf", @"text/xml" : @"xml", @"text/yaml" : @"yaml", @"video/3gpp" : @"3gp", @"video/3gpp2" : @"3g2", @"video/animaflex" : @"afl", @"video/avi" : @"avi", @"video/avs-video" : @"avs", @"video/dl" : @"dl", @"video/fli" : @"fli", @"video/gl" : @"gl", @"video/h261" : @"h261", @"video/h263" : @"h263", @"video/h264" : @"h264", @"video/jpeg" : @"jpgv", @"video/jpm" : @"jpm", @"video/mj2" : @"mj2", @"video/mp4" : @"mp4", @"video/mpeg" : @"mpg", @"video/msvideo" : @"avi", @"video/ogg" : @"ogv", @"video/quicktime" : @"mov", @"video/vdo" : @"vdo", @"video/vnd.dece.hd" : @"uvh", @"video/vnd.dece.mobile" : @"uvm", @"video/vnd.dece.pd" : @"uvp", @"video/vnd.dece.sd" : @"uvs", @"video/vnd.dece.video" : @"uvv", @"video/vnd.dvb.file" : @"dvb", @"video/vnd.fvt" : @"fvt", @"video/vnd.mpegurl" : @"mxu", @"video/vnd.ms-playready.media.pyv" : @"pyv", @"video/vnd.rn-realvideo" : @"rv", @"video/vnd.uvvu.mp4" : @"uvu", @"video/vnd.vivo" : @"viv", @"video/vosaic" : @"vos", @"video/webm" : @"webm", @"video/x-amt-demorun" : @"xdr", @"video/x-amt-showrun" : @"xsr", @"video/x-atomic3d-feature" : @"fmf", @"video/x-dl" : @"dl", @"video/x-dv" : @"dv", @"video/x-f4v" : @"f4v", @"video/x-fli" : @"fli", @"video/x-flv" : @"flv", @"video/x-gl" : @"gl", @"video/x-isvideo" : @"isu", @"video/x-la-asf" : @"lsf", @"video/x-m4v" : @"m4v", @"video/x-matroska" : @"mkv", @"video/x-mng" : @"mng", @"video/x-motion-jpeg" : @"mjpg", @"video/x-mpeg" : @"mpg", @"video/x-mpeq2a" : @"mp2", @"video/x-ms-asf" : @"asf", @"video/x-ms-asf-plugin" : @"asx", @"video/x-ms-vob" : @"vob", @"video/x-ms-wm" : @"wm", @"video/x-ms-wmv" : @"wmv", @"video/x-ms-wmx" : @"wmx", @"video/x-ms-wvx" : @"wvx", @"video/x-msvideo" : @"avi", @"video/x-qtc" : @"qtc", @"video/x-scm" : @"scm", @"video/x-sgi-movie" : @"movie", @"video/x-smv" : @"smv", @"windows/metafile" : @"wmf", @"www/mime" : @"mime", @"x-conference/x-cooltalk" : @"ice", @"x-music/x-midi" : @"midi", @"x-world/x-3dmf" : @"3dmf", @"x-world/x-svr" : @"svr", @"x-world/x-vrml" : @"vrml", @"x-world/x-vrt" : @"vrt", @"xgl/drawing" : @"xgz", @"xgl/movie" : @"xmz", }; }); return result; } + (nullable NSString *)mimeTypeForFileExtension:(NSString *)fileExtension { return [self genericExtensionTypesToMIMETypes][fileExtension]; } + (NSDictionary *)genericExtensionTypesToMIMETypes { static NSDictionary *result = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ result = @{ @"123" : @"application/vnd.lotus-1-2-3", @"3dml" : @"text/vnd.in3d.3dml", @"3ds" : @"image/x-3ds", @"3g2" : @"video/3gpp2", @"3gp" : @"video/3gpp", @"7z" : @"application/x-7z-compressed", @"aab" : @"application/x-authorware-bin", @"aac" : @"audio/x-aac", @"aam" : @"application/x-authorware-map", @"aas" : @"application/x-authorware-seg", @"abw" : @"application/x-abiword", @"ac" : @"application/pkix-attr-cert", @"acc" : @"application/vnd.americandynamics.acc", @"ace" : @"application/x-ace-compressed", @"acu" : @"application/vnd.acucobol", @"acutc" : @"application/vnd.acucorp", @"adp" : @"audio/adpcm", @"aep" : @"application/vnd.audiograph", @"afm" : @"application/x-font-type1", @"afp" : @"application/vnd.ibm.modcap", @"ahead" : @"application/vnd.ahead.space", @"ai" : @"application/postscript", @"aif" : @"audio/x-aiff", @"aifc" : @"audio/x-aiff", @"aiff" : @"audio/x-aiff", @"air" : @"application/vnd.adobe.air-application-installer-package+zip", @"ait" : @"application/vnd.dvb.ait", @"ami" : @"application/vnd.amiga.ami", @"apk" : @"application/vnd.android.package-archive", @"appcache" : @"text/cache-manifest", @"application" : @"application/x-ms-application", @"apr" : @"application/vnd.lotus-approach", @"arc" : @"application/x-freearc", @"asc" : @"application/pgp-signature", @"asf" : @"video/x-ms-asf", @"asm" : @"text/x-asm", @"aso" : @"application/vnd.accpac.simply.aso", @"asx" : @"video/x-ms-asf", @"atc" : @"application/vnd.acucorp", @"atom" : @"application/atom+xml", @"atomcat" : @"application/atomcat+xml", @"atomsvc" : @"application/atomsvc+xml", @"atx" : @"application/vnd.antix.game-component", @"au" : @"audio/basic", @"avi" : @"video/x-msvideo", @"aw" : @"application/applixware", @"azf" : @"application/vnd.airzip.filesecure.azf", @"azs" : @"application/vnd.airzip.filesecure.azs", @"azw" : @"application/vnd.amazon.ebook", @"bat" : @"application/x-msdownload", @"bcpio" : @"application/x-bcpio", @"bdf" : @"application/x-font-bdf", @"bdm" : @"application/vnd.syncml.dm+wbxml", @"bed" : @"application/vnd.realvnc.bed", @"bh2" : @"application/vnd.fujitsu.oasysprs", @"bin" : @"application/octet-stream", @"blb" : @"application/x-blorb", @"blorb" : @"application/x-blorb", @"bmi" : @"application/vnd.bmi", @"bmp" : @"image/bmp", @"book" : @"application/vnd.framemaker", @"box" : @"application/vnd.previewsystems.box", @"boz" : @"application/x-bzip2", @"bpk" : @"application/octet-stream", @"btif" : @"image/prs.btif", @"bz" : @"application/x-bzip", @"bz2" : @"application/x-bzip2", @"c" : @"text/x-c", @"c11amc" : @"application/vnd.cluetrust.cartomobile-config", @"c11amz" : @"application/vnd.cluetrust.cartomobile-config-pkg", @"c4d" : @"application/vnd.clonk.c4group", @"c4f" : @"application/vnd.clonk.c4group", @"c4g" : @"application/vnd.clonk.c4group", @"c4p" : @"application/vnd.clonk.c4group", @"c4u" : @"application/vnd.clonk.c4group", @"cab" : @"application/vnd.ms-cab-compressed", @"caf" : @"audio/x-caf", @"cap" : @"application/vnd.tcpdump.pcap", @"car" : @"application/vnd.curl.car", @"cat" : @"application/vnd.ms-pki.seccat", @"cb7" : @"application/x-cbr", @"cba" : @"application/x-cbr", @"cbr" : @"application/x-cbr", @"cbt" : @"application/x-cbr", @"cbz" : @"application/x-cbr", @"cc" : @"text/x-c", @"cct" : @"application/x-director", @"ccxml" : @"application/ccxml+xml", @"cdbcmsg" : @"application/vnd.contact.cmsg", @"cdf" : @"application/x-netcdf", @"cdkey" : @"application/vnd.mediastation.cdkey", @"cdmia" : @"application/cdmi-capability", @"cdmic" : @"application/cdmi-container", @"cdmid" : @"application/cdmi-domain", @"cdmio" : @"application/cdmi-object", @"cdmiq" : @"application/cdmi-queue", @"cdx" : @"chemical/x-cdx", @"cdxml" : @"application/vnd.chemdraw+xml", @"cdy" : @"application/vnd.cinderella", @"cer" : @"application/pkix-cert", @"cfs" : @"application/x-cfs-compressed", @"cgm" : @"image/cgm", @"chat" : @"application/x-chat", @"chm" : @"application/vnd.ms-htmlhelp", @"chrt" : @"application/vnd.kde.kchart", @"cif" : @"chemical/x-cif", @"cii" : @"application/vnd.anser-web-certificate-issue-initiation", @"cil" : @"application/vnd.ms-artgalry", @"cla" : @"application/vnd.claymore", @"class" : @"application/java-vm", @"clkk" : @"application/vnd.crick.clicker.keyboard", @"clkp" : @"application/vnd.crick.clicker.palette", @"clkt" : @"application/vnd.crick.clicker.template", @"clkw" : @"application/vnd.crick.clicker.wordbank", @"clkx" : @"application/vnd.crick.clicker", @"clp" : @"application/x-msclip", @"cmc" : @"application/vnd.cosmocaller", @"cmdf" : @"chemical/x-cmdf", @"cml" : @"chemical/x-cml", @"cmp" : @"application/vnd.yellowriver-custom-menu", @"cmx" : @"image/x-cmx", @"cod" : @"application/vnd.rim.cod", @"com" : @"application/x-msdownload", @"conf" : @"text/plain", @"cpio" : @"application/x-cpio", @"cpp" : @"text/x-c", @"cpt" : @"application/mac-compactpro", @"crd" : @"application/x-mscardfile", @"crl" : @"application/pkix-crl", @"crt" : @"application/x-x509-ca-cert", @"cryptonote" : @"application/vnd.rig.cryptonote", @"csh" : @"application/x-csh", @"csml" : @"chemical/x-csml", @"csp" : @"application/vnd.commonspace", @"css" : @"text/css", @"cst" : @"application/x-director", @"csv" : @"text/csv", @"cu" : @"application/cu-seeme", @"curl" : @"text/vnd.curl", @"cww" : @"application/prs.cww", @"cxt" : @"application/x-director", @"cxx" : @"text/x-c", @"dae" : @"model/vnd.collada+xml", @"daf" : @"application/vnd.mobius.daf", @"dart" : @"application/vnd.dart", @"dataless" : @"application/vnd.fdsn.seed", @"davmount" : @"application/davmount+xml", @"dbk" : @"application/docbook+xml", @"dcr" : @"application/x-director", @"dcurl" : @"text/vnd.curl.dcurl", @"dd2" : @"application/vnd.oma.dd2+xml", @"ddd" : @"application/vnd.fujixerox.ddd", @"deb" : @"application/x-debian-package", @"def" : @"text/plain", @"deploy" : @"application/octet-stream", @"der" : @"application/x-x509-ca-cert", @"dfac" : @"application/vnd.dreamfactory", @"dgc" : @"application/x-dgc-compressed", @"dic" : @"text/x-c", @"dir" : @"application/x-director", @"dis" : @"application/vnd.mobius.dis", @"dist" : @"application/octet-stream", @"distz" : @"application/octet-stream", @"djv" : @"image/vnd.djvu", @"djvu" : @"image/vnd.djvu", @"dll" : @"application/x-msdownload", @"dmg" : @"application/x-apple-diskimage", @"dmp" : @"application/vnd.tcpdump.pcap", @"dms" : @"application/octet-stream", @"dna" : @"application/vnd.dna", @"doc" : @"application/msword", @"docm" : @"application/vnd.ms-word.document.macroenabled.12", @"docx" : @"application/vnd.openxmlformats-officedocument.wordprocessingml.document", @"dot" : @"application/msword", @"dotm" : @"application/vnd.ms-word.template.macroenabled.12", @"dotx" : @"application/vnd.openxmlformats-officedocument.wordprocessingml.template", @"dp" : @"application/vnd.osgi.dp", @"dpg" : @"application/vnd.dpgraph", @"dra" : @"audio/vnd.dra", @"dsc" : @"text/prs.lines.logTag", @"dssc" : @"application/dssc+der", @"dtb" : @"application/x-dtbook+xml", @"dtd" : @"application/xml-dtd", @"dts" : @"audio/vnd.dts", @"dtshd" : @"audio/vnd.dts.hd", @"dump" : @"application/octet-stream", @"dvb" : @"video/vnd.dvb.file", @"dvi" : @"application/x-dvi", @"dwf" : @"model/vnd.dwf", @"dwg" : @"image/vnd.dwg", @"dxf" : @"image/vnd.dxf", @"dxp" : @"application/vnd.spotfire.dxp", @"dxr" : @"application/x-director", @"ecelp4800" : @"audio/vnd.nuera.ecelp4800", @"ecelp7470" : @"audio/vnd.nuera.ecelp7470", @"ecelp9600" : @"audio/vnd.nuera.ecelp9600", @"ecma" : @"application/ecmascript", @"edm" : @"application/vnd.novadigm.edm", @"edx" : @"application/vnd.novadigm.edx", @"efif" : @"application/vnd.picsel", @"ei6" : @"application/vnd.pg.osasli", @"elc" : @"application/octet-stream", @"emf" : @"application/x-msmetafile", @"eml" : @"message/rfc822", @"emma" : @"application/emma+xml", @"emz" : @"application/x-msmetafile", @"eol" : @"audio/vnd.digital-winds", @"eot" : @"application/vnd.ms-fontobject", @"eps" : @"application/postscript", @"epub" : @"application/epub+zip", @"es3" : @"application/vnd.eszigno3+xml", @"esa" : @"application/vnd.osgi.subsystem", @"esf" : @"application/vnd.epson.esf", @"et3" : @"application/vnd.eszigno3+xml", @"etx" : @"text/x-setext", @"eva" : @"application/x-eva", @"evy" : @"application/x-envoy", @"exe" : @"application/x-msdownload", @"exi" : @"application/exi", @"ext" : @"application/vnd.novadigm.ext", @"ez" : @"application/andrew-inset", @"ez2" : @"application/vnd.ezpix-album", @"ez3" : @"application/vnd.ezpix-package", @"f" : @"text/x-fortran", @"f4v" : @"video/x-f4v", @"f77" : @"text/x-fortran", @"f90" : @"text/x-fortran", @"fbs" : @"image/vnd.fastbidsheet", @"fcdt" : @"application/vnd.adobe.formscentral.fcdt", @"fcs" : @"application/vnd.isac.fcs", @"fdf" : @"application/vnd.fdf", @"fe_launch" : @"application/vnd.denovo.fcselayout-link", @"fg5" : @"application/vnd.fujitsu.oasysgp", @"fgd" : @"application/x-director", @"fh" : @"image/x-freehand", @"fh4" : @"image/x-freehand", @"fh5" : @"image/x-freehand", @"fh7" : @"image/x-freehand", @"fhc" : @"image/x-freehand", @"fig" : @"application/x-xfig", @"flac" : @"audio/x-flac", @"fli" : @"video/x-fli", @"flo" : @"application/vnd.micrografx.flo", @"flv" : @"video/x-flv", @"flw" : @"application/vnd.kde.kivio", @"flx" : @"text/vnd.fmi.flexstor", @"fly" : @"text/vnd.fly", @"fm" : @"application/vnd.framemaker", @"fnc" : @"application/vnd.frogans.fnc", @"for" : @"text/x-fortran", @"fpx" : @"image/vnd.fpx", @"frame" : @"application/vnd.framemaker", @"fsc" : @"application/vnd.fsc.weblaunch", @"fst" : @"image/vnd.fst", @"ftc" : @"application/vnd.fluxtime.clip", @"fti" : @"application/vnd.anser-web-funds-transfer-initiation", @"fvt" : @"video/vnd.fvt", @"fxp" : @"application/vnd.adobe.fxp", @"fxpl" : @"application/vnd.adobe.fxp", @"fzs" : @"application/vnd.fuzzysheet", @"g2w" : @"application/vnd.geoplan", @"g3" : @"image/g3fax", @"g3w" : @"application/vnd.geospace", @"gac" : @"application/vnd.groove-account", @"gam" : @"application/x-tads", @"gbr" : @"application/rpki-ghostbusters", @"gca" : @"application/x-gca-compressed", @"gdl" : @"model/vnd.gdl", @"geo" : @"application/vnd.dynageo", @"gex" : @"application/vnd.geometry-explorer", @"ggb" : @"application/vnd.geogebra.file", @"ggt" : @"application/vnd.geogebra.tool", @"ghf" : @"application/vnd.groove-help", @"gif" : @"image/gif", @"gim" : @"application/vnd.groove-identity-message", @"gml" : @"application/gml+xml", @"gmx" : @"application/vnd.gmx", @"gnumeric" : @"application/x-gnumeric", @"gph" : @"application/vnd.flographit", @"gpx" : @"application/gpx+xml", @"gqf" : @"application/vnd.grafeq", @"gqs" : @"application/vnd.grafeq", @"gram" : @"application/srgs", @"gramps" : @"application/x-gramps-xml", @"gre" : @"application/vnd.geometry-explorer", @"grv" : @"application/vnd.groove-injector", @"grxml" : @"application/srgs+xml", @"gsf" : @"application/x-font-ghostscript", @"gtar" : @"application/x-gtar", @"gtm" : @"application/vnd.groove-tool-message", @"gtw" : @"model/vnd.gtw", @"gv" : @"text/vnd.graphviz", @"gxf" : @"application/gxf", @"gxt" : @"application/vnd.geonext", @"h" : @"text/x-c", @"h261" : @"video/h261", @"h263" : @"video/h263", @"h264" : @"video/h264", @"hal" : @"application/vnd.hal+xml", @"hbci" : @"application/vnd.hbci", @"hdf" : @"application/x-hdf", @"heic" : @"image/heic", @"heif" : @"image/heif", @"hh" : @"text/x-c", @"hlp" : @"application/winhlp", @"hpgl" : @"application/vnd.hp-hpgl", @"hpid" : @"application/vnd.hp-hpid", @"hps" : @"application/vnd.hp-hps", @"hqx" : @"application/mac-binhex40", @"htke" : @"application/vnd.kenameaapp", @"htm" : @"text/html", @"html" : @"text/html", @"hvd" : @"application/vnd.yamaha.hv-dic", @"hvp" : @"application/vnd.yamaha.hv-voice", @"hvs" : @"application/vnd.yamaha.hv-script", @"i2g" : @"application/vnd.intergeo", @"icc" : @"application/vnd.iccprofile", @"ice" : @"x-conference/x-cooltalk", @"icm" : @"application/vnd.iccprofile", @"ico" : @"image/x-icon", @"ics" : @"text/calendar", @"ief" : @"image/ief", @"ifb" : @"text/calendar", @"ifm" : @"application/vnd.shana.informed.formdata", @"iges" : @"model/iges", @"igl" : @"application/vnd.igloader", @"igm" : @"application/vnd.insors.igm", @"igs" : @"model/iges", @"igx" : @"application/vnd.micrografx.igx", @"iif" : @"application/vnd.shana.informed.interchange", @"imp" : @"application/vnd.accpac.simply.imp", @"ims" : @"application/vnd.ms-ims", @"in" : @"text/plain", @"ink" : @"application/inkml+xml", @"inkml" : @"application/inkml+xml", @"install" : @"application/x-install-instructions", @"iota" : @"application/vnd.astraea-software.iota", @"ipfix" : @"application/ipfix", @"ipk" : @"application/vnd.shana.informed.package", @"irm" : @"application/vnd.ibm.rights-management", @"irp" : @"application/vnd.irepository.package+xml", @"iso" : @"application/x-iso9660-image", @"itp" : @"application/vnd.shana.informed.formtemplate", @"ivp" : @"application/vnd.immervision-ivp", @"ivu" : @"application/vnd.immervision-ivu", @"jad" : @"text/vnd.sun.j2me.app-descriptor", @"jam" : @"application/vnd.jam", @"jar" : @"application/java-archive", @"java" : @"text/x-java-source", @"jisp" : @"application/vnd.jisp", @"jlt" : @"application/vnd.hp-jlyt", @"jnlp" : @"application/x-java-jnlp-file", @"joda" : @"application/vnd.joost.joda-archive", @"jpe" : @"image/jpeg", @"jpeg" : @"image/jpeg", @"jpg" : @"image/jpeg", @"jpgm" : @"video/jpm", @"jpgv" : @"video/jpeg", @"jpm" : @"video/jpm", @"js" : @"application/javascript", @"json" : @"application/json", @"jsonml" : @"application/jsonml+json", @"kar" : @"audio/midi", @"karbon" : @"application/vnd.kde.karbon", @"kfo" : @"application/vnd.kde.kformula", @"kia" : @"application/vnd.kidspiration", @"kml" : @"application/vnd.google-earth.kml+xml", @"kmz" : @"application/vnd.google-earth.kmz", @"kne" : @"application/vnd.kinar", @"knp" : @"application/vnd.kinar", @"kon" : @"application/vnd.kde.kontour", @"kpr" : @"application/vnd.kde.kpresenter", @"kpt" : @"application/vnd.kde.kpresenter", @"kpxx" : @"application/vnd.ds-keypoint", @"ksp" : @"application/vnd.kde.kspread", @"ktr" : @"application/vnd.kahootz", @"ktx" : @"image/ktx", @"ktz" : @"application/vnd.kahootz", @"kwd" : @"application/vnd.kde.kword", @"kwt" : @"application/vnd.kde.kword", @"lasxml" : @"application/vnd.las.las+xml", @"latex" : @"application/x-latex", @"lbd" : @"application/vnd.llamagraphics.life-balance.desktop", @"lbe" : @"application/vnd.llamagraphics.life-balance.exchange+xml", @"les" : @"application/vnd.hhe.lesson-player", @"lha" : @"application/x-lzh-compressed", @"link66" : @"application/vnd.route66.link66+xml", @"list" : @"text/plain", @"list3820" : @"application/vnd.ibm.modcap", @"listafp" : @"application/vnd.ibm.modcap", @"lnk" : @"application/x-ms-shortcut", @"log" : @"text/plain", @"lostxml" : @"application/lost+xml", @"lrf" : @"application/octet-stream", @"lrm" : @"application/vnd.ms-lrm", @"ltf" : @"application/vnd.frogans.ltf", @"lvp" : @"audio/vnd.lucent.voice", @"lwp" : @"application/vnd.lotus-wordpro", @"lzh" : @"application/x-lzh-compressed", @"m13" : @"application/x-msmediaview", @"m14" : @"application/x-msmediaview", @"m1v" : @"video/mpeg", @"m21" : @"application/mp21", @"m2a" : @"audio/mpeg", @"m2v" : @"video/mpeg", @"m3a" : @"audio/mpeg", @"m3u" : @"audio/x-mpegurl", @"m3u8" : @"application/vnd.apple.mpegurl", @"m4a" : @"audio/mp4", @"m4u" : @"video/vnd.mpegurl", @"m4v" : @"video/x-m4v", @"ma" : @"application/mathematica", @"mads" : @"application/mads+xml", @"mag" : @"application/vnd.ecowin.chart", @"maker" : @"application/vnd.framemaker", @"man" : @"text/troff", @"mar" : @"application/octet-stream", @"mathml" : @"application/mathml+xml", @"mb" : @"application/mathematica", @"mbk" : @"application/vnd.mobius.mbk", @"mbox" : @"application/mbox", @"mc1" : @"application/vnd.medcalcdata", @"mcd" : @"application/vnd.mcd", @"mcurl" : @"text/vnd.curl.mcurl", @"mdb" : @"application/x-msaccess", @"mdi" : @"image/vnd.ms-modi", @"me" : @"text/troff", @"mesh" : @"model/mesh", @"meta4" : @"application/metalink4+xml", @"metalink" : @"application/metalink+xml", @"mets" : @"application/mets+xml", @"mfm" : @"application/vnd.mfmp", @"mft" : @"application/rpki-manifest", @"mgp" : @"application/vnd.osgeo.mapguide.package", @"mgz" : @"application/vnd.proteus.magazine", @"mid" : @"audio/midi", @"midi" : @"audio/midi", @"mie" : @"application/x-mie", @"mif" : @"application/vnd.mif", @"mime" : @"message/rfc822", @"mj2" : @"video/mj2", @"mjp2" : @"video/mj2", @"mk3d" : @"video/x-matroska", @"mka" : @"audio/x-matroska", @"mks" : @"video/x-matroska", @"mkv" : @"video/x-matroska", @"mlp" : @"application/vnd.dolby.mlp", @"mmd" : @"application/vnd.chipnuts.karaoke-mmd", @"mmf" : @"application/vnd.smaf", @"mmr" : @"image/vnd.fujixerox.edmics-mmr", @"mng" : @"video/x-mng", @"mny" : @"application/x-msmoney", @"mobi" : @"application/x-mobipocket-ebook", @"mods" : @"application/mods+xml", @"mov" : @"video/quicktime", @"movie" : @"video/x-sgi-movie", @"mp2" : @"audio/mpeg", @"mp21" : @"application/mp21", @"mp2a" : @"audio/mpeg", @"mp3" : @"audio/mpeg", @"mp4" : @"video/mp4", @"mp4a" : @"audio/mp4", @"mp4s" : @"application/mp4", @"mp4v" : @"video/mp4", @"mpc" : @"application/vnd.mophun.certificate", @"mpe" : @"video/mpeg", @"mpeg" : @"video/mpeg", @"mpg" : @"video/mpeg", @"mpg4" : @"video/mp4", @"mpga" : @"audio/mpeg", @"mpkg" : @"application/vnd.apple.installer+xml", @"mpm" : @"application/vnd.blueice.multipass", @"mpn" : @"application/vnd.mophun.application", @"mpp" : @"application/vnd.ms-project", @"mpt" : @"application/vnd.ms-project", @"mpy" : @"application/vnd.ibm.minipay", @"mqy" : @"application/vnd.mobius.mqy", @"mrc" : @"application/marc", @"mrcx" : @"application/marcxml+xml", @"ms" : @"text/troff", @"mscml" : @"application/mediaservercontrol+xml", @"mseed" : @"application/vnd.fdsn.mseed", @"mseq" : @"application/vnd.mseq", @"msf" : @"application/vnd.epson.msf", @"msh" : @"model/mesh", @"msi" : @"application/x-msdownload", @"msl" : @"application/vnd.mobius.msl", @"msty" : @"application/vnd.muvee.style", @"mts" : @"model/vnd.mts", @"mus" : @"application/vnd.musician", @"musicxml" : @"application/vnd.recordare.musicxml+xml", @"mvb" : @"application/x-msmediaview", @"mwf" : @"application/vnd.mfer", @"mxf" : @"application/mxf", @"mxl" : @"application/vnd.recordare.musicxml", @"mxml" : @"application/xv+xml", @"mxs" : @"application/vnd.triscape.mxs", @"mxu" : @"video/vnd.mpegurl", @"n-gage" : @"application/vnd.nokia.n-gage.symbian.install", @"n3" : @"text/n3", @"nb" : @"application/mathematica", @"nbp" : @"application/vnd.wolfram.player", @"nc" : @"application/x-netcdf", @"ncx" : @"application/x-dtbncx+xml", @"nfo" : @"text/x-nfo", @"ngdat" : @"application/vnd.nokia.n-gage.data", @"nitf" : @"application/vnd.nitf", @"nlu" : @"application/vnd.neurolanguage.nlu", @"nml" : @"application/vnd.enliven", @"nnd" : @"application/vnd.noblenet-directory", @"nns" : @"application/vnd.noblenet-sealer", @"nnw" : @"application/vnd.noblenet-web", @"npx" : @"image/vnd.net-fpx", @"nsc" : @"application/x-conference", @"nsf" : @"application/vnd.lotus-notes", @"ntf" : @"application/vnd.nitf", @"nzb" : @"application/x-nzb", @"oa2" : @"application/vnd.fujitsu.oasys2", @"oa3" : @"application/vnd.fujitsu.oasys3", @"oas" : @"application/vnd.fujitsu.oasys", @"obd" : @"application/x-msbinder", @"obj" : @"application/x-tgif", @"oda" : @"application/oda", @"odb" : @"application/vnd.oasis.opendocument.database", @"odc" : @"application/vnd.oasis.opendocument.chart", @"odf" : @"application/vnd.oasis.opendocument.formula", @"odft" : @"application/vnd.oasis.opendocument.formula-template", @"odg" : @"application/vnd.oasis.opendocument.graphics", @"odi" : @"application/vnd.oasis.opendocument.image", @"odm" : @"application/vnd.oasis.opendocument.text-master", @"odp" : @"application/vnd.oasis.opendocument.presentation", @"ods" : @"application/vnd.oasis.opendocument.spreadsheet", @"odt" : @"application/vnd.oasis.opendocument.text", @"oga" : @"audio/ogg", @"ogg" : @"audio/ogg", @"ogv" : @"video/ogg", @"ogx" : @"application/ogg", @"omdoc" : @"application/omdoc+xml", @"onepkg" : @"application/onenote", @"onetmp" : @"application/onenote", @"onetoc" : @"application/onenote", @"onetoc2" : @"application/onenote", @"opf" : @"application/oebps-package+xml", @"opml" : @"text/x-opml", @"oprc" : @"application/vnd.palm", @"org" : @"application/vnd.lotus-organizer", @"osf" : @"application/vnd.yamaha.openscoreformat", @"osfpvg" : @"application/vnd.yamaha.openscoreformat.osfpvg+xml", @"otc" : @"application/vnd.oasis.opendocument.chart-template", @"otf" : @"application/x-font-otf", @"otg" : @"application/vnd.oasis.opendocument.graphics-template", @"oth" : @"application/vnd.oasis.opendocument.text-web", @"oti" : @"application/vnd.oasis.opendocument.image-template", @"otp" : @"application/vnd.oasis.opendocument.presentation-template", @"ots" : @"application/vnd.oasis.opendocument.spreadsheet-template", @"ott" : @"application/vnd.oasis.opendocument.text-template", @"oxps" : @"application/oxps", @"oxt" : @"application/vnd.openofficeorg.extension", @"p" : @"text/x-pascal", @"p10" : @"application/pkcs10", @"p12" : @"application/x-pkcs12", @"p7b" : @"application/x-pkcs7-certificates", @"p7c" : @"application/pkcs7-mime", @"p7m" : @"application/pkcs7-mime", @"p7r" : @"application/x-pkcs7-certreqresp", @"p7s" : @"application/pkcs7-signature", @"p8" : @"application/pkcs8", @"pas" : @"text/x-pascal", @"paw" : @"application/vnd.pawaafile", @"pbd" : @"application/vnd.powerbuilder6", @"pbm" : @"image/x-portable-bitmap", @"pcap" : @"application/vnd.tcpdump.pcap", @"pcf" : @"application/x-font-pcf", @"pcl" : @"application/vnd.hp-pcl", @"pclxl" : @"application/vnd.hp-pclxl", @"pct" : @"image/x-pict", @"pcurl" : @"application/vnd.curl.pcurl", @"pcx" : @"image/x-pcx", @"pdb" : @"application/vnd.palm", @"pdf" : @"application/pdf", @"pfa" : @"application/x-font-type1", @"pfb" : @"application/x-font-type1", @"pfm" : @"application/x-font-type1", @"pfr" : @"application/font-tdpfr", @"pfx" : @"application/x-pkcs12", @"pgm" : @"image/x-portable-graymap", @"pgn" : @"application/x-chess-pgn", @"pgp" : @"application/pgp-encrypted", @"pic" : @"image/x-pict", @"pkg" : @"application/octet-stream", @"pki" : @"application/pkixcmp", @"pkipath" : @"application/pkix-pkipath", @"plb" : @"application/vnd.3gpp.pic-bw-large", @"plc" : @"application/vnd.mobius.plc", @"plf" : @"application/vnd.pocketlearn", @"pls" : @"application/pls+xml", @"pml" : @"application/vnd.ctc-posml", @"png" : @"image/png", @"pnm" : @"image/x-portable-anymap", @"portpkg" : @"application/vnd.macports.portpkg", @"pot" : @"application/vnd.ms-powerpoint", @"potm" : @"application/vnd.ms-powerpoint.template.macroenabled.12", @"potx" : @"application/vnd.openxmlformats-officedocument.presentationml.template", @"ppam" : @"application/vnd.ms-powerpoint.addin.macroenabled.12", @"ppd" : @"application/vnd.cups-ppd", @"ppm" : @"image/x-portable-pixmap", @"pps" : @"application/vnd.ms-powerpoint", @"ppsm" : @"application/vnd.ms-powerpoint.slideshow.macroenabled.12", @"ppsx" : @"application/vnd.openxmlformats-officedocument.presentationml.slideshow", @"ppt" : @"application/vnd.ms-powerpoint", @"pptm" : @"application/vnd.ms-powerpoint.presentation.macroenabled.12", @"pptx" : @"application/vnd.openxmlformats-officedocument.presentationml.presentation", @"pqa" : @"application/vnd.palm", @"prc" : @"application/x-mobipocket-ebook", @"pre" : @"application/vnd.lotus-freelance", @"prf" : @"application/pics-rules", @"ps" : @"application/postscript", @"psb" : @"application/vnd.3gpp.pic-bw-small", @"psd" : @"image/vnd.adobe.photoshop", @"psf" : @"application/x-font-linux-psf", @"pskcxml" : @"application/pskc+xml", @"ptid" : @"application/vnd.pvi.ptid1", @"pub" : @"application/x-mspublisher", @"pvb" : @"application/vnd.3gpp.pic-bw-var", @"pwn" : @"application/vnd.3m.post-it-notes", @"pya" : @"audio/vnd.ms-playready.media.pya", @"pyv" : @"video/vnd.ms-playready.media.pyv", @"qam" : @"application/vnd.epson.quickanime", @"qbo" : @"application/vnd.intu.qbo", @"qfx" : @"application/vnd.intu.qfx", @"qps" : @"application/vnd.publishare-delta-tree", @"qt" : @"video/quicktime", @"qwd" : @"application/vnd.quark.quarkxpress", @"qwt" : @"application/vnd.quark.quarkxpress", @"qxb" : @"application/vnd.quark.quarkxpress", @"qxd" : @"application/vnd.quark.quarkxpress", @"qxl" : @"application/vnd.quark.quarkxpress", @"qxt" : @"application/vnd.quark.quarkxpress", @"ra" : @"audio/x-pn-realaudio", @"ram" : @"audio/x-pn-realaudio", @"rar" : @"application/x-rar-compressed", @"ras" : @"image/x-cmu-raster", @"rcprofile" : @"application/vnd.ipunplugged.rcprofile", @"rdf" : @"application/rdf+xml", @"rdz" : @"application/vnd.data-vision.rdz", @"rep" : @"application/vnd.businessobjects", @"res" : @"application/x-dtbresource+xml", @"rgb" : @"image/x-rgb", @"rif" : @"application/reginfo+xml", @"rip" : @"audio/vnd.rip", @"ris" : @"application/x-research-info-systems", @"rl" : @"application/resource-lists+xml", @"rlc" : @"image/vnd.fujixerox.edmics-rlc", @"rld" : @"application/resource-lists-diff+xml", @"rm" : @"application/vnd.rn-realmedia", @"rmi" : @"audio/midi", @"rmp" : @"audio/x-pn-realaudio-plugin", @"rms" : @"application/vnd.jcp.javame.midlet-rms", @"rmvb" : @"application/vnd.rn-realmedia-vbr", @"rnc" : @"application/relax-ng-compact-syntax", @"roa" : @"application/rpki-roa", @"roff" : @"text/troff", @"rp9" : @"application/vnd.cloanto.rp9", @"rpss" : @"application/vnd.nokia.radio-presets", @"rpst" : @"application/vnd.nokia.radio-preset", @"rq" : @"application/sparql-query", @"rs" : @"application/rls-services+xml", @"rsd" : @"application/rsd+xml", @"rss" : @"application/rss+xml", @"rtf" : @"application/rtf", @"rtx" : @"text/richtext", @"s" : @"text/x-asm", @"s3m" : @"audio/s3m", @"saf" : @"application/vnd.yamaha.smaf-audio", @"sbml" : @"application/sbml+xml", @"sc" : @"application/vnd.ibm.secure-container", @"scd" : @"application/x-msschedule", @"scm" : @"application/vnd.lotus-screencam", @"scq" : @"application/scvp-cv-request", @"scs" : @"application/scvp-cv-response", @"scurl" : @"text/vnd.curl.scurl", @"sda" : @"application/vnd.stardivision.draw", @"sdc" : @"application/vnd.stardivision.calc", @"sdd" : @"application/vnd.stardivision.impress", @"sdkd" : @"application/vnd.solent.sdkm+xml", @"sdkm" : @"application/vnd.solent.sdkm+xml", @"sdp" : @"application/sdp", @"sdw" : @"application/vnd.stardivision.writer", @"see" : @"application/vnd.seemail", @"seed" : @"application/vnd.fdsn.seed", @"sema" : @"application/vnd.sema", @"semd" : @"application/vnd.semd", @"semf" : @"application/vnd.semf", @"ser" : @"application/java-serialized-object", @"setpay" : @"application/set-payment-initiation", @"setreg" : @"application/set-registration-initiation", @"sfd-hdstx" : @"application/vnd.hydrostatix.sof-data", @"sfs" : @"application/vnd.spotfire.sfs", @"sfv" : @"text/x-sfv", @"sgi" : @"image/sgi", @"sgl" : @"application/vnd.stardivision.writer-global", @"sgm" : @"text/sgml", @"sgml" : @"text/sgml", @"sh" : @"application/x-sh", @"shar" : @"application/x-shar", @"shf" : @"application/shf+xml", @"sid" : @"image/x-mrsid-image", @"sig" : @"application/pgp-signature", @"sil" : @"audio/silk", @"silo" : @"model/mesh", @"sis" : @"application/vnd.symbian.install", @"sisx" : @"application/vnd.symbian.install", @"sit" : @"application/x-stuffit", @"sitx" : @"application/x-stuffitx", @"skd" : @"application/vnd.koan", @"skm" : @"application/vnd.koan", @"skp" : @"application/vnd.koan", @"skt" : @"application/vnd.koan", @"sldm" : @"application/vnd.ms-powerpoint.slide.macroenabled.12", @"sldx" : @"application/vnd.openxmlformats-officedocument.presentationml.slide", @"slt" : @"application/vnd.epson.salt", @"sm" : @"application/vnd.stepmania.stepchart", @"smf" : @"application/vnd.stardivision.math", @"smi" : @"application/smil+xml", @"smil" : @"application/smil+xml", @"smv" : @"video/x-smv", @"smzip" : @"application/vnd.stepmania.package", @"snd" : @"audio/basic", @"snf" : @"application/x-font-snf", @"so" : @"application/octet-stream", @"spc" : @"application/x-pkcs7-certificates", @"spf" : @"application/vnd.yamaha.smaf-phrase", @"spl" : @"application/x-futuresplash", @"spot" : @"text/vnd.in3d.spot", @"spp" : @"application/scvp-vp-response", @"spq" : @"application/scvp-vp-request", @"spx" : @"audio/ogg", @"sql" : @"application/x-sql", @"src" : @"application/x-wais-source", @"srt" : @"application/x-subrip", @"sru" : @"application/sru+xml", @"srx" : @"application/sparql-results+xml", @"ssdl" : @"application/ssdl+xml", @"sse" : @"application/vnd.kodak-descriptor", @"ssf" : @"application/vnd.epson.ssf", @"ssml" : @"application/ssml+xml", @"st" : @"application/vnd.sailingtracker.track", @"stc" : @"application/vnd.sun.xml.calc.template", @"std" : @"application/vnd.sun.xml.draw.template", @"stf" : @"application/vnd.wt.stf", @"sti" : @"application/vnd.sun.xml.impress.template", @"stk" : @"application/hyperstudio", @"stl" : @"application/vnd.ms-pki.stl", @"str" : @"application/vnd.pg.format", @"stw" : @"application/vnd.sun.xml.writer.template", @"sub" : @"text/vnd.dvb.subtitle", @"sus" : @"application/vnd.sus-calendar", @"susp" : @"application/vnd.sus-calendar", @"sv4cpio" : @"application/x-sv4cpio", @"sv4crc" : @"application/x-sv4crc", @"svc" : @"application/vnd.dvb.service", @"svd" : @"application/vnd.svd", @"svg" : @"image/svg+xml", @"svgz" : @"image/svg+xml", @"swa" : @"application/x-director", @"swf" : @"application/x-shockwave-flash", @"swi" : @"application/vnd.aristanetworks.swi", @"sxc" : @"application/vnd.sun.xml.calc", @"sxd" : @"application/vnd.sun.xml.draw", @"sxg" : @"application/vnd.sun.xml.writer.global", @"sxi" : @"application/vnd.sun.xml.impress", @"sxm" : @"application/vnd.sun.xml.math", @"sxw" : @"application/vnd.sun.xml.writer", @"t" : @"text/troff", @"t3" : @"application/x-t3vm-image", @"taglet" : @"application/vnd.mynfc", @"tao" : @"application/vnd.tao.intent-module-archive", @"tar" : @"application/x-tar", @"tcap" : @"application/vnd.3gpp2.tcap", @"tcl" : @"application/x-tcl", @"teacher" : @"application/vnd.smart.teacher", @"tei" : @"application/tei+xml", @"teicorpus" : @"application/tei+xml", @"tex" : @"application/x-tex", @"texi" : @"application/x-texinfo", @"texinfo" : @"application/x-texinfo", @"text" : @"text/plain", @"tfi" : @"application/thraud+xml", @"tfm" : @"application/x-tex-tfm", @"tga" : @"image/x-tga", @"thmx" : @"application/vnd.ms-officetheme", @"tif" : @"image/tiff", @"tiff" : @"image/tiff", @"tmo" : @"application/vnd.tmobile-livetv", @"torrent" : @"application/x-bittorrent", @"tpl" : @"application/vnd.groove-tool-template", @"tpt" : @"application/vnd.trid.tpt", @"tr" : @"text/troff", @"tra" : @"application/vnd.trueapp", @"trm" : @"application/x-msterminal", @"tsd" : @"application/timestamped-data", @"tsv" : @"text/tab-separated-values", @"ttc" : @"application/x-font-ttf", @"ttf" : @"application/x-font-ttf", @"ttl" : @"text/turtle", @"twd" : @"application/vnd.simtech-mindmapper", @"twds" : @"application/vnd.simtech-mindmapper", @"txd" : @"application/vnd.genomatix.tuxedo", @"txf" : @"application/vnd.mobius.txf", @"txt" : @"text/plain", @"u32" : @"application/x-authorware-bin", @"udeb" : @"application/x-debian-package", @"ufd" : @"application/vnd.ufdl", @"ufdl" : @"application/vnd.ufdl", @"ulx" : @"application/x-glulx", @"umj" : @"application/vnd.umajin", @"unityweb" : @"application/vnd.unity", @"uoml" : @"application/vnd.uoml+xml", @"uri" : @"text/uri-list", @"uris" : @"text/uri-list", @"urls" : @"text/uri-list", @"ustar" : @"application/x-ustar", @"utz" : @"application/vnd.uiq.theme", @"uu" : @"text/x-uuencode", @"uva" : @"audio/vnd.dece.audio", @"uvd" : @"application/vnd.dece.data", @"uvf" : @"application/vnd.dece.data", @"uvg" : @"image/vnd.dece.graphic", @"uvh" : @"video/vnd.dece.hd", @"uvi" : @"image/vnd.dece.graphic", @"uvm" : @"video/vnd.dece.mobile", @"uvp" : @"video/vnd.dece.pd", @"uvs" : @"video/vnd.dece.sd", @"uvt" : @"application/vnd.dece.ttml+xml", @"uvu" : @"video/vnd.uvvu.mp4", @"uvv" : @"video/vnd.dece.video", @"uvva" : @"audio/vnd.dece.audio", @"uvvd" : @"application/vnd.dece.data", @"uvvf" : @"application/vnd.dece.data", @"uvvg" : @"image/vnd.dece.graphic", @"uvvh" : @"video/vnd.dece.hd", @"uvvi" : @"image/vnd.dece.graphic", @"uvvm" : @"video/vnd.dece.mobile", @"uvvp" : @"video/vnd.dece.pd", @"uvvs" : @"video/vnd.dece.sd", @"uvvt" : @"application/vnd.dece.ttml+xml", @"uvvu" : @"video/vnd.uvvu.mp4", @"uvvv" : @"video/vnd.dece.video", @"uvvx" : @"application/vnd.dece.unspecified", @"uvvz" : @"application/vnd.dece.zip", @"uvx" : @"application/vnd.dece.unspecified", @"uvz" : @"application/vnd.dece.zip", @"vcard" : @"text/vcard", @"vcd" : @"application/x-cdlink", @"vcf" : @"text/x-vcard", @"vcg" : @"application/vnd.groove-vcard", @"vcs" : @"text/x-vcalendar", @"vcx" : @"application/vnd.vcx", @"vis" : @"application/vnd.visionary", @"viv" : @"video/vnd.vivo", @"vob" : @"video/x-ms-vob", @"vor" : @"application/vnd.stardivision.writer", @"vox" : @"application/x-authorware-bin", @"vrml" : @"model/vrml", @"vsd" : @"application/vnd.visio", @"vsf" : @"application/vnd.vsf", @"vss" : @"application/vnd.visio", @"vst" : @"application/vnd.visio", @"vsw" : @"application/vnd.visio", @"vtu" : @"model/vnd.vtu", @"vxml" : @"application/voicexml+xml", @"w3d" : @"application/x-director", @"wad" : @"application/x-doom", @"wav" : @"audio/x-wav", @"wax" : @"audio/x-ms-wax", @"wbmp" : @"image/vnd.wap.wbmp", @"wbs" : @"application/vnd.criticaltools.wbs+xml", @"wbxml" : @"application/vnd.wap.wbxml", @"wcm" : @"application/vnd.ms-works", @"wdb" : @"application/vnd.ms-works", @"wdp" : @"image/vnd.ms-photo", @"weba" : @"audio/webm", @"webm" : @"video/webm", @"webp" : @"image/webp", @"wg" : @"application/vnd.pmi.widget", @"wgt" : @"application/widget", @"wks" : @"application/vnd.ms-works", @"wm" : @"video/x-ms-wm", @"wma" : @"audio/x-ms-wma", @"wmd" : @"application/x-ms-wmd", @"wmf" : @"application/x-msmetafile", @"wml" : @"text/vnd.wap.wml", @"wmlc" : @"application/vnd.wap.wmlc", @"wmls" : @"text/vnd.wap.wmlscript", @"wmlsc" : @"application/vnd.wap.wmlscriptc", @"wmv" : @"video/x-ms-wmv", @"wmx" : @"video/x-ms-wmx", @"wmz" : @"application/x-msmetafile", @"woff" : @"application/font-woff", @"wpd" : @"application/vnd.wordperfect", @"wpl" : @"application/vnd.ms-wpl", @"wps" : @"application/vnd.ms-works", @"wqd" : @"application/vnd.wqd", @"wri" : @"application/x-mswrite", @"wrl" : @"model/vrml", @"wsdl" : @"application/wsdl+xml", @"wspolicy" : @"application/wspolicy+xml", @"wtb" : @"application/vnd.webturbo", @"wvx" : @"video/x-ms-wvx", @"x32" : @"application/x-authorware-bin", @"x3d" : @"model/x3d+xml", @"x3db" : @"model/x3d+binary", @"x3dbz" : @"model/x3d+binary", @"x3dv" : @"model/x3d+vrml", @"x3dvz" : @"model/x3d+vrml", @"x3dz" : @"model/x3d+xml", @"xaml" : @"application/xaml+xml", @"xap" : @"application/x-silverlight-app", @"xar" : @"application/vnd.xara", @"xbap" : @"application/x-ms-xbap", @"xbd" : @"application/vnd.fujixerox.docuworks.binder", @"xbm" : @"image/x-xbitmap", @"xdf" : @"application/xcap-diff+xml", @"xdm" : @"application/vnd.syncml.dm+xml", @"xdp" : @"application/vnd.adobe.xdp+xml", @"xdssc" : @"application/dssc+xml", @"xdw" : @"application/vnd.fujixerox.docuworks", @"xenc" : @"application/xenc+xml", @"xer" : @"application/patch-ops-error+xml", @"xfdf" : @"application/vnd.adobe.xfdf", @"xfdl" : @"application/vnd.xfdl", @"xht" : @"application/xhtml+xml", @"xhtml" : @"application/xhtml+xml", @"xhvml" : @"application/xv+xml", @"xif" : @"image/vnd.xiff", @"xla" : @"application/vnd.ms-excel", @"xlam" : @"application/vnd.ms-excel.addin.macroenabled.12", @"xlc" : @"application/vnd.ms-excel", @"xlf" : @"application/x-xliff+xml", @"xlm" : @"application/vnd.ms-excel", @"xls" : @"application/vnd.ms-excel", @"xlsb" : @"application/vnd.ms-excel.sheet.binary.macroenabled.12", @"xlsm" : @"application/vnd.ms-excel.sheet.macroenabled.12", @"xlsx" : @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @"xlt" : @"application/vnd.ms-excel", @"xltm" : @"application/vnd.ms-excel.template.macroenabled.12", @"xltx" : @"application/vnd.openxmlformats-officedocument.spreadsheetml.template", @"xlw" : @"application/vnd.ms-excel", @"xm" : @"audio/xm", @"xml" : @"application/xml", @"xo" : @"application/vnd.olpc-sugar", @"xop" : @"application/xop+xml", @"xpi" : @"application/x-xpinstall", @"xpl" : @"application/xproc+xml", @"xpm" : @"image/x-xpixmap", @"xpr" : @"application/vnd.is-xpr", @"xps" : @"application/vnd.ms-xpsdocument", @"xpw" : @"application/vnd.intercon.formnet", @"xpx" : @"application/vnd.intercon.formnet", @"xsl" : @"application/xml", @"xslt" : @"application/xslt+xml", @"xsm" : @"application/vnd.syncml+xml", @"xspf" : @"application/xspf+xml", @"xul" : @"application/vnd.mozilla.xul+xml", @"xvm" : @"application/xv+xml", @"xvml" : @"application/xv+xml", @"xwd" : @"image/x-xwindowdump", @"xyz" : @"chemical/x-xyz", @"xz" : @"application/x-xz", @"yang" : @"application/yang", @"yin" : @"application/yin+xml", @"z1" : @"application/x-zmachine", @"z2" : @"application/x-zmachine", @"z3" : @"application/x-zmachine", @"z4" : @"application/x-zmachine", @"z5" : @"application/x-zmachine", @"z6" : @"application/x-zmachine", @"z7" : @"application/x-zmachine", @"z8" : @"application/x-zmachine", @"zaz" : @"application/vnd.zzazz.deck+xml", @"zip" : OWSMimeTypeApplicationZip, @"zir" : @"application/vnd.zul", @"zirz" : @"application/vnd.zul", @"zmm" : @"application/vnd.handheld-entertainment+xml", }; }); return result; } + (nullable NSString *)fileExtensionForMIMETypeViaLookup:(NSString *)mimeType { return [[self genericMIMETypesToExtensionTypes] objectForKey:mimeType]; } + (nullable NSString *)fileExtensionForMIMEType:(NSString *)mimeType { // Try to deduce the file extension by using a lookup table. // // This should be more accurate than deducing the file extension by // converting to a UTI type. For example, .m4a files will have a // UTI type of kUTTypeMPEG4Audio which incorrectly yields the file // extension .mp4 instead of .m4a. NSString *_Nullable fileExtension = [self fileExtensionForMIMETypeViaLookup:mimeType]; if (!fileExtension) { // Try to deduce the file extension by converting to a UTI type. fileExtension = [self fileExtensionForMIMETypeViaUTIType:mimeType]; } return fileExtension; } + (nullable NSString *)utiTypeForFileExtension:(NSString *)fileExtension { NSString *_Nullable utiType = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag( kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL); return utiType; } @end NS_ASSUME_NONNULL_END