""" Python Character Mapping Codec generated from 'ICELAND.TXT'.


Written by Marc-Andre Lemburg (mal@lemburg.com).

(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.

"""#"

import codecs

### Codec APIs

class Codec(codecs.Codec):

    def encode(self,input,errors='strict'):

        return codecs.charmap_encode(input,errors,encoding_map)
        
    def decode(self,input,errors='strict'):

        return codecs.charmap_decode(input,errors,decoding_map)

class StreamWriter(Codec,codecs.StreamWriter):
    pass
        
class StreamReader(Codec,codecs.StreamReader):
    pass

### encodings module API

def getregentry():

    return (Codec().encode,Codec().decode,StreamReader,StreamWriter)

### Decoding Map

decoding_map = {

	0x0080: 0x00c4,	# LATIN CAPITAL LETTER A WITH DIAERESIS
	0x0081: 0x00c5,	# LATIN CAPITAL LETTER A WITH RING ABOVE
	0x0082: 0x00c7,	# LATIN CAPITAL LETTER C WITH CEDILLA
	0x0083: 0x00c9,	# LATIN CAPITAL LETTER E WITH ACUTE
	0x0084: 0x00d1,	# LATIN CAPITAL LETTER N WITH TILDE
	0x0085: 0x00d6,	# LATIN CAPITAL LETTER O WITH DIAERESIS
	0x0086: 0x00dc,	# LATIN CAPITAL LETTER U WITH DIAERESIS
	0x0087: 0x00e1,	# LATIN SMALL LETTER A WITH ACUTE
	0x0088: 0x00e0,	# LATIN SMALL LETTER A WITH GRAVE
	0x0089: 0x00e2,	# LATIN SMALL LETTER A WITH CIRCUMFLEX
	0x008a: 0x00e4,	# LATIN SMALL LETTER A WITH DIAERESIS
	0x008b: 0x00e3,	# LATIN SMALL LETTER A WITH TILDE
	0x008c: 0x00e5,	# LATIN SMALL LETTER A WITH RING ABOVE
	0x008d: 0x00e7,	# LATIN SMALL LETTER C WITH CEDILLA
	0x008e: 0x00e9,	# LATIN SMALL LETTER E WITH ACUTE
	0x008f: 0x00e8,	# LATIN SMALL LETTER E WITH GRAVE
	0x0090: 0x00ea,	# LATIN SMALL LETTER E WITH CIRCUMFLEX
	0x0091: 0x00eb,	# LATIN SMALL LETTER E WITH DIAERESIS
	0x0092: 0x00ed,	# LATIN SMALL LETTER I WITH ACUTE
	0x0093: 0x00ec,	# LATIN SMALL LETTER I WITH GRAVE
	0x0094: 0x00ee,	# LATIN SMALL LETTER I WITH CIRCUMFLEX
	0x0095: 0x00ef,	# LATIN SMALL LETTER I WITH DIAERESIS
	0x0096: 0x00f1,	# LATIN SMALL LETTER N WITH TILDE
	0x0097: 0x00f3,	# LATIN SMALL LETTER O WITH ACUTE
	0x0098: 0x00f2,	# LATIN SMALL LETTER O WITH GRAVE
	0x0099: 0x00f4,	# LATIN SMALL LETTER O WITH CIRCUMFLEX
	0x009a: 0x00f6,	# LATIN SMALL LETTER O WITH DIAERESIS
	0x009b: 0x00f5,	# LATIN SMALL LETTER O WITH TILDE
	0x009c: 0x00fa,	# LATIN SMALL LETTER U WITH ACUTE
	0x009d: 0x00f9,	# LATIN SMALL LETTER U WITH GRAVE
	0x009e: 0x00fb,	# LATIN SMALL LETTER U WITH CIRCUMFLEX
	0x009f: 0x00fc,	# LATIN SMALL LETTER U WITH DIAERESIS
	0x00a0: 0x00dd,	# LATIN CAPITAL LETTER Y WITH ACUTE
	0x00a1: 0x00b0,	# DEGREE SIGN
	0x00a4: 0x00a7,	# SECTION SIGN
	0x00a5: 0x2022,	# BULLET
	0x00a6: 0x00b6,	# PILCROW SIGN
	0x00a7: 0x00df,	# LATIN SMALL LETTER SHARP S
	0x00a8: 0x00ae,	# REGISTERED SIGN
	0x00aa: 0x2122,	# TRADE MARK SIGN
	0x00ab: 0x00b4,	# ACUTE ACCENT
	0x00ac: 0x00a8,	# DIAERESIS
	0x00ad: 0x2260,	# NOT EQUAL TO
	0x00ae: 0x00c6,	# LATIN CAPITAL LIGATURE AE
	0x00af: 0x00d8,	# LATIN CAPITAL LETTER O WITH STROKE
	0x00b0: 0x221e,	# INFINITY
	0x00b2: 0x2264,	# LESS-THAN OR EQUAL TO
	0x00b3: 0x2265,	# GREATER-THAN OR EQUAL TO
	0x00b4: 0x00a5,	# YEN SIGN
	0x00b6: 0x2202,	# PARTIAL DIFFERENTIAL
	0x00b7: 0x2211,	# N-ARY SUMMATION
	0x00b8: 0x220f,	# N-ARY PRODUCT
	0x00b9: 0x03c0,	# GREEK SMALL LETTER PI
	0x00ba: 0x222b,	# INTEGRAL
	0x00bb: 0x00aa,	# FEMININE ORDINAL INDICATOR
	0x00bc: 0x00ba,	# MASCULINE ORDINAL INDICATOR
	0x00bd: 0x2126,	# OHM SIGN
	0x00be: 0x00e6,	# LATIN SMALL LIGATURE AE
	0x00bf: 0x00f8,	# LATIN SMALL LETTER O WITH STROKE
	0x00c0: 0x00bf,	# INVERTED QUESTION MARK
	0x00c1: 0x00a1,	# INVERTED EXCLAMATION MARK
	0x00c2: 0x00ac,	# NOT SIGN
	0x00c3: 0x221a,	# SQUARE ROOT
	0x00c4: 0x0192,	# LATIN SMALL LETTER F WITH HOOK
	0x00c5: 0x2248,	# ALMOST EQUAL TO
	0x00c6: 0x2206,	# INCREMENT
	0x00c7: 0x00ab,	# LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
	0x00c8: 0x00bb,	# RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
	0x00c9: 0x2026,	# HORIZONTAL ELLIPSIS
	0x00ca: 0x00a0,	# NO-BREAK SPACE
	0x00cb: 0x00c0,	# LATIN CAPITAL LETTER A WITH GRAVE
	0x00cc: 0x00c3,	# LATIN CAPITAL LETTER A WITH TILDE
	0x00cd: 0x00d5,	# LATIN CAPITAL LETTER O WITH TILDE
	0x00ce: 0x0152,	# LATIN CAPITAL LIGATURE OE
	0x00cf: 0x0153,	# LATIN SMALL LIGATURE OE
	0x00d0: 0x2013,	# EN DASH
	0x00d1: 0x2014,	# EM DASH
	0x00d2: 0x201c,	# LEFT DOUBLE QUOTATION MARK
	0x00d3: 0x201d,	# RIGHT DOUBLE QUOTATION MARK
	0x00d4: 0x2018,	# LEFT SINGLE QUOTATION MARK
	0x00d5: 0x2019,	# RIGHT SINGLE QUOTATION MARK
	0x00d6: 0x00f7,	# DIVISION SIGN
	0x00d7: 0x25ca,	# LOZENGE
	0x00d8: 0x00ff,	# LATIN SMALL LETTER Y WITH DIAERESIS
	0x00d9: 0x0178,	# LATIN CAPITAL LETTER Y WITH DIAERESIS
	0x00da: 0x2044,	# FRACTION SLASH
	0x00db: 0x00a4,	# CURRENCY SIGN
	0x00dc: 0x00d0,	# LATIN CAPITAL LETTER ETH
	0x00dd: 0x00f0,	# LATIN SMALL LETTER ETH
	0x00df: 0x00fe,	# LATIN SMALL LETTER THORN
	0x00e0: 0x00fd,	# LATIN SMALL LETTER Y WITH ACUTE
	0x00e1: 0x00b7,	# MIDDLE DOT
	0x00e2: 0x201a,	# SINGLE LOW-9 QUOTATION MARK
	0x00e3: 0x201e,	# DOUBLE LOW-9 QUOTATION MARK
	0x00e4: 0x2030,	# PER MILLE SIGN
	0x00e5: 0x00c2,	# LATIN CAPITAL LETTER A WITH CIRCUMFLEX
	0x00e6: 0x00ca,	# LATIN CAPITAL LETTER E WITH CIRCUMFLEX
	0x00e7: 0x00c1,	# LATIN CAPITAL LETTER A WITH ACUTE
	0x00e8: 0x00cb,	# LATIN CAPITAL LETTER E WITH DIAERESIS
	0x00e9: 0x00c8,	# LATIN CAPITAL LETTER E WITH GRAVE
	0x00ea: 0x00cd,	# LATIN CAPITAL LETTER I WITH ACUTE
	0x00eb: 0x00ce,	# LATIN CAPITAL LETTER I WITH CIRCUMFLEX
	0x00ec: 0x00cf,	# LATIN CAPITAL LETTER I WITH DIAERESIS
	0x00ed: 0x00cc,	# LATIN CAPITAL LETTER I WITH GRAVE
	0x00ee: 0x00d3,	# LATIN CAPITAL LETTER O WITH ACUTE
	0x00ef: 0x00d4,	# LATIN CAPITAL LETTER O WITH CIRCUMFLEX
	0x00f0: None,	# UNDEFINED
	0x00f1: 0x00d2,	# LATIN CAPITAL LETTER O WITH GRAVE
	0x00f2: 0x00da,	# LATIN CAPITAL LETTER U WITH ACUTE
	0x00f3: 0x00db,	# LATIN CAPITAL LETTER U WITH CIRCUMFLEX
	0x00f4: 0x00d9,	# LATIN CAPITAL LETTER U WITH GRAVE
	0x00f5: 0x0131,	# LATIN SMALL LETTER DOTLESS I
	0x00f6: 0x02c6,	# MODIFIER LETTER CIRCUMFLEX ACCENT
	0x00f7: 0x02dc,	# SMALL TILDE
	0x00f8: 0x00af,	# MACRON
	0x00f9: 0x02d8,	# BREVE
	0x00fa: 0x02d9,	# DOT ABOVE
	0x00fb: 0x02da,	# RING ABOVE
	0x00fc: 0x00b8,	# CEDILLA
	0x00fd: 0x02dd,	# DOUBLE ACUTE ACCENT
	0x00fe: 0x02db,	# OGONEK
	0x00ff: 0x02c7,	# CARON
}

### Encoding Map

encoding_map = {}
for k,v in decoding_map.items():
    encoding_map[v] = k
