codice_fiscale 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,199 @@
1
+ #--
2
+ # Copyleft shura. [shura1991@gmail.com]
3
+ #
4
+ # This file is part of codice_fiscale.
5
+ #
6
+ # codice_fiscale is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # codice_fiscale is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with codice_fiscale. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ class CodiceFiscale < String
21
+ VERSION = '0.1'
22
+
23
+ MONTH = [nil, ?A, ?B, ?C, ?D, ?E, ?H, ?L, ?M, ?P, ?R, ?S, ?T]
24
+
25
+ ALFANUM_TO_CODE = {
26
+ odd: {
27
+ ?0 => 1, ?1 => 0, ?2 => 5, ?3 => 7, ?4 => 9,
28
+ ?5 => 13, ?6 => 15, ?7 => 17, ?8 => 19, ?9 => 21,
29
+ ?A => 1, ?B => 0, ?C => 5, ?D => 7, ?E => 9,
30
+ ?F => 13, ?G => 15, ?H => 17, ?I => 19, ?J => 21,
31
+ ?K => 2, ?L => 4, ?M => 18, ?N => 20, ?O => 11,
32
+ ?P => 3, ?Q => 6, ?R => 8, ?S => 12, ?T => 14,
33
+ ?U => 16, ?V => 10, ?W => 22, ?X => 25,
34
+ ?Y => 24, ?Z => 23
35
+ },
36
+ even: {
37
+ ?0 => 0, ?1 => 1, ?2 => 2, ?3 => 3, ?4 => 4,
38
+ ?5 => 5, ?6 => 6, ?7 => 7, ?8 => 8, ?9 => 9,
39
+ ?A => 0, ?B => 1, ?C => 2, ?D => 3, ?E => 4,
40
+ ?F => 5, ?G => 6, ?H => 7, ?I => 8, ?J => 9,
41
+ ?K => 10, ?L => 11, ?M => 12, ?N => 13, ?O => 14,
42
+ ?P => 15, ?Q => 16, ?R => 17, ?S => 18, ?T => 19,
43
+ ?U => 20, ?V => 21, ?W => 22, ?X => 23, ?Y => 24,
44
+ ?Z => 25
45
+ }
46
+ }
47
+
48
+ ALTERNATIVE = {
49
+ ?0 => ?L, ?1 => ?M, ?2 => ?N, ?3 => ?P, ?4 => ?Q,
50
+ ?5 => ?R, ?6 => ?S, ?7 => ?T, ?8 => ?U, ?9 => ?V,
51
+ 0 => ?L, 1 => ?M, 2 => ?N, 3 => ?P, 4 => ?Q,
52
+ 5 => ?R, 6 => ?S, 7 => ?T, 8 => ?U, 9 => ?V
53
+ }
54
+
55
+ DBDIR = File.realpath(File.join(File.dirname(__FILE__), 'db'))
56
+
57
+ attr_reader :name, :surname, :bday, :bplace, :gender
58
+
59
+ def name?
60
+ !!@name
61
+ end
62
+
63
+ def surname?
64
+ !!@surname
65
+ end
66
+
67
+ def bday?
68
+ !!@bday
69
+ end
70
+
71
+ def bplace?
72
+ !!@bplace
73
+ end
74
+
75
+ def gender?
76
+ !!@gender
77
+ end
78
+
79
+ def data?
80
+ self.name? and self.surname? and self.bday? and self.bplace? and self.gender?
81
+ end
82
+
83
+ def name=(n)
84
+ @name = n.upcase if n.is_a?(String) and n =~ /^[A-Z]+$/i
85
+
86
+ generate_code!
87
+ end
88
+
89
+ def surname=(s)
90
+ @surname = s.upcase if s.is_a?(String) and s =~ /^[A-Z]+$/i
91
+
92
+ generate_code!
93
+ end
94
+
95
+ def bday=(day)
96
+ @bday = case day
97
+ when Time
98
+ {
99
+ day: day.day,
100
+ mon: day.mon,
101
+ year: day.year.to_s[-2, 2].to_i
102
+ }
103
+ when String
104
+ self.bday = Time.new($4, $3, $1) if day =~ /^(\d{1,2})([^\dA-Z])(\d{1,2})\2(\d{2}||\d{4})$/i
105
+ @bday
106
+ else @bday
107
+ end
108
+
109
+ generate_code!
110
+ end
111
+
112
+ def bplace=(place)
113
+ return unless place.is_a?(String)
114
+ place.strip!
115
+ place.upcase!
116
+ if place =~ /^([A-Z']+\s*)+(?:\(([A-Z]{2})\))?$/
117
+ @bplace = {
118
+ city: $1.strip,
119
+ prov: $2
120
+ }
121
+ end
122
+
123
+ generate_code!
124
+ end
125
+
126
+ def gender=(gen)
127
+ if gen == :M or gen == :m or gen =~ /^m(ale)?$/i
128
+ @gender = :M
129
+ elsif gen == :F or gen == :f or gen =~ /^f(emale)?$/i
130
+ @gender = :F
131
+ end
132
+
133
+ generate_code!
134
+ end
135
+
136
+ def initialize(options = {})
137
+ self.name = options[:name]
138
+ self.surname = options[:surname]
139
+ self.bday = options[:bday]
140
+ self.bplace = options[:bplace]
141
+ self.gender = options[:gender]
142
+ end
143
+
144
+ def generate_code!
145
+ return unless self.data?
146
+ code = ""
147
+
148
+ # TRIPLET FOR SURNAME
149
+ code << (self.surname.scan(/[^AEIOU]/).join + self.surname.scan(/[AEIOU]/).join)[0, 3].ljust(3, 'X')
150
+
151
+ # TRIPLET FOR NAME
152
+ cons = self.name.scan(/[^AEIOU]/).join
153
+ cons << cons[1] && cons[1] = '' if cons.size > 3
154
+ code << (cons + self.name.scan(/[AEIOU]/).join)[0, 3].ljust(3, 'X')
155
+
156
+ # QUINTET FOR BDAY AND GENDER
157
+ code << self.bday[:year].to_s.rjust(2, '0')
158
+ code << CodiceFiscale::MONTH[self.bday[:mon]]
159
+ code << (self.bday[:day] + (self.gender == :F ? 40 : 0)).to_s.rjust(2, '0')
160
+
161
+ # QUARTET FOR BPLACE
162
+ code << self.belfiore_code(self.bplace[:city], self.bplace[:prov])
163
+
164
+ # CONTROL CODE
165
+ sum = 0
166
+ code.split(//).each_with_index {|ch, i|
167
+ sum += ALFANUM_TO_CODE[i.odd? ? :even : :odd][ch]
168
+ }
169
+ code << ((sum % 26) + 65).chr
170
+
171
+ self.replace(code)
172
+ end
173
+
174
+ def belfiore_code(city, province = nil)
175
+ code = nil
176
+ File.open(File.join(DBDIR, (province and province == 'EE' ? 'ee.db' : "#{city[0].downcase}.db"))) {|f|
177
+ f.each_line {|line|
178
+ co, c, p = line.strip.split(';')
179
+ code = co.dup and break if c == city and (province and province != 'EE' ? p == province : true)
180
+ }
181
+ }
182
+
183
+ code
184
+ end
185
+
186
+ def alternative(level = 1)
187
+ code = self.dup
188
+ code.scan(/[0-9]/).reverse[0, level].each {|n|
189
+ i = code.rindex(n)
190
+ code[i] = ALTERNATIVE[code[i]]
191
+ }
192
+
193
+ code
194
+ end
195
+
196
+ def alternative!(level = 1)
197
+ self.replace(self.alternative(level))
198
+ end
199
+ end
data/lib/db/a.db ADDED
@@ -0,0 +1,436 @@
1
+ A001;ABANO;TE
2
+ A004;ABBADIA;CE
3
+ A005;ABBADIA;LA
4
+ A006;ABBADIA;SA
5
+ A007;ABBASANTA;OR
6
+ A008;ABBATEGGIO;PE
7
+ A010;ABBIATEGRASSO;MI
8
+ A012;ABETONE;PT
9
+ A013;ABRIOLA;PZ
10
+ A014;ACATE;RG
11
+ A015;ACCADIA;FG
12
+ A016;ACCEGLIO;CN
13
+ A017;ACCETTURA;MT
14
+ A018;ACCIANO;AQ
15
+ A019;ACCUMOLI;RI
16
+ A020;ACERENZA;PZ
17
+ A023;ACERNO;SA
18
+ A024;ACERRA;NA
19
+ A025;ACI;BO
20
+ A026;ACI;CA
21
+ A027;ACI;CA
22
+ A029;ACI;SA
23
+ A028;ACIREALE;CT
24
+ A031;ACQUACANINA;MC
25
+ A032;ACQUAFONDATA;FR
26
+ A033;ACQUAFORMOSA;CS
27
+ A034;ACQUAFREDDA;BS
28
+ A035;ACQUALAGNA;PU
29
+ A039;ACQUANEGRA;CR
30
+ A038;ACQUANEGRA;SU
31
+ A040;ACQUAPENDENTE;VT
32
+ A041;ACQUAPPESA;CS
33
+ A042;ACQUARICA;DE
34
+ A043;ACQUARO;VV
35
+ A044;ACQUASANTA;TE
36
+ A045;ACQUASPARTA;TR
37
+ A050;ACQUAVIVA;CO
38
+ A048;ACQUAVIVA;DE
39
+ A051;ACQUAVIVA D'ISERNIA;IS
40
+ A047;ACQUAVIVA;PI
41
+ A049;ACQUAVIVA;PL
42
+ M211;ACQUEDOLCI;ME
43
+ A052;ACQUI;TE
44
+ A053;ACRI;CS
45
+ A054;ACUTO;FR
46
+ A055;ADELFIA;BA
47
+ A056;ADRANO;CT
48
+ A057;ADRARA;SA
49
+ A058;ADRARA;SA
50
+ A059;ADRIA;RO
51
+ A060;ADRO;BS
52
+ A061;AFFI;VR
53
+ A062;AFFILE;RM
54
+ A064;AFRAGOLA;NA
55
+ A065;AFRICO;RC
56
+ A067;AGAZZANO;PC
57
+ A068;AGEROLA;NA
58
+ A069;AGGIUS;SS
59
+ A070;AGIRA;EN
60
+ A071;AGLIANA;PT
61
+ A072;AGLIANO;TE
62
+ A074;AGLIE';TO
63
+ H848;AGLIENTU;SS
64
+ A075;AGNA;PD
65
+ A076;AGNADELLO;CR
66
+ A077;AGNANA;CA
67
+ A080;AGNONE;IS
68
+ A082;AGNOSINE;BS
69
+ A083;AGORDO;BL
70
+ A084;AGOSTA;RM
71
+ A085;AGRA;VA
72
+ A087;AGRATE;BR
73
+ A088;AGRATE;CO
74
+ A089;AGRIGENTO;AG
75
+ A091;AGROPOLI;SA
76
+ A092;AGUGLIANO;AN
77
+ A093;AGUGLIARO;VI
78
+ A096;AICURZIO;MI
79
+ A097;AIDOMAGGIORE;OR
80
+ A098;AIDONE;EN
81
+ A100;AIELLI;AQ
82
+ A102;AIELLO;CA
83
+ A103;AIELLO;DE
84
+ A101;AIELLO;DE
85
+ A105;AIETA;CS
86
+ A106;AILANO;CE
87
+ A107;AILOCHE;BI
88
+ A109;AIRASCA;TO
89
+ A110;AIROLA;BN
90
+ A111;AIROLE;IM
91
+ A112;AIRUNO;LC
92
+ A113;AISONE;CN
93
+ A116;ALA;TN
94
+ A115;ALA';DE
95
+ A117;ALA;DI
96
+ A118;ALAGNA;PV
97
+ A119;ALAGNA;VA
98
+ A120;ALANNO;PE
99
+ A121;ALANO;DI
100
+ A122;ALASSIO;SV
101
+ A123;ALATRI;FR
102
+ A124;ALBA;CN
103
+ A125;ALBA;AD
104
+ A126;ALBAGIARA;OR
105
+ A127;ALBAIRATE;MI
106
+ A128;ALBANELLA;SA
107
+ A131;ALBANO;DI
108
+ A132;ALBANO;LA
109
+ A129;ALBANO;SA
110
+ A130;ALBANO;VE
111
+ A134;ALBAREDO;AR
112
+ A137;ALBAREDO D'ADIGE;VR
113
+ A135;ALBAREDO;PE
114
+ A138;ALBARETO;PR
115
+ A139;ALBARETTO;DE
116
+ A143;ALBAVILLA;CO
117
+ A145;ALBENGA;SV
118
+ A146;ALBERA;LI
119
+ A149;ALBEROBELLO;BA
120
+ A150;ALBERONA;FG
121
+ A153;ALBESE;CO
122
+ A154;ALBETTONE;VI
123
+ A155;ALBI;CZ
124
+ A158;ALBIANO;TN
125
+ A157;ALBIANO D'IVREA;TO
126
+ A159;ALBIATE;MI
127
+ A160;ALBIDONA;CS
128
+ A161;ALBIGNASEGO;PD
129
+ A162;ALBINEA;RE
130
+ A163;ALBINO;BG
131
+ A164;ALBIOLO;CO
132
+ A166;ALBISOLA;SU
133
+ A165;ALBISSOLA;MA
134
+ A167;ALBIZZATE;VA
135
+ A171;ALBONESE;PV
136
+ A172;ALBOSAGGIA;SO
137
+ A173;ALBUGNANO;AT
138
+ A175;ALBUZZANO;PV
139
+ A176;ALCAMO;TP
140
+ A177;ALCARA;LI
141
+ A178;ALDENO;TN
142
+ A179;ALDINO .ALDEIN.;BZ
143
+ A180;ALES;OR
144
+ A182;ALESSANDRIA;AL
145
+ A183;ALESSANDRIA;DE
146
+ A181;ALESSANDRIA;DE
147
+ A184;ALESSANO;LE
148
+ A185;ALEZIO;LE
149
+ A186;ALFANO;SA
150
+ A187;ALFEDENA;AQ
151
+ A188;ALFIANELLO;BS
152
+ A189;ALFIANO;NA
153
+ A191;ALFONSINE;RA
154
+ A192;ALGHERO;SS
155
+ A193;ALGUA;BG
156
+ A194;ALI';ME
157
+ A201;ALI';TE
158
+ A195;ALIA;PA
159
+ A196;ALIANO;MT
160
+ A197;ALICE;BE
161
+ A198;ALICE;CA
162
+ A199;ALICE;SU
163
+ A200;ALIFE;CE
164
+ A202;ALIMENA;PA
165
+ A203;ALIMINUSA;PA
166
+ A204;ALLAI;OR
167
+ A206;ALLEGHE;BL
168
+ A205;ALLEIN;AO
169
+ A207;ALLERONA;TR
170
+ A208;ALLISTE;LE
171
+ A210;ALLUMIERE;RM
172
+ A211;ALLUVIONI;CA
173
+ A214;ALME';BG
174
+ A216;ALMENNO;SA
175
+ A217;ALMENNO;SA
176
+ A218;ALMESE;TO
177
+ A220;ALONTE;VI
178
+ A221;ALPETTE;TO
179
+ A222;ALPIGNANO;TO
180
+ A223;ALSENO;PC
181
+ A224;ALSERIO;CO
182
+ A225;ALTAMURA;BA
183
+ A226;ALTARE;SV
184
+ A228;ALTAVILLA;IR
185
+ A229;ALTAVILLA;MI
186
+ A227;ALTAVILLA;MO
187
+ A230;ALTAVILLA;SI
188
+ A231;ALTAVILLA;VI
189
+ A233;ALTIDONA;AP
190
+ A234;ALTILIA;CS
191
+ A235;ALTINO;CH
192
+ A236;ALTISSIMO;VI
193
+ A237;ALTIVOLE;TV
194
+ A238;ALTO;CN
195
+ A239;ALTOFONTE;PA
196
+ A240;ALTOMONTE;CS
197
+ A241;ALTOPASCIO;LU
198
+ A242;ALVIANO;TR
199
+ A243;ALVIGNANO;CE
200
+ A244;ALVITO;FR
201
+ A246;ALZANO;LO
202
+ A245;ALZANO;SC
203
+ A249;ALZATE;BR
204
+ A251;AMALFI;SA
205
+ A252;AMANDOLA;AP
206
+ A253;AMANTEA;CS
207
+ A254;AMARO;UD
208
+ A255;AMARONI;CZ
209
+ A256;AMASENO;FR
210
+ A257;AMATO;CZ
211
+ A258;AMATRICE;RI
212
+ A259;AMBIVERE;BG
213
+ A260;AMBLAR;TN
214
+ A261;AMEGLIA;SP
215
+ A262;AMELIA;TR
216
+ A263;AMENDOLARA;CS
217
+ A264;AMENO;NO
218
+ A265;AMOROSI;BN
219
+ A267;AMPEZZO;UD
220
+ A268;ANACAPRI;NA
221
+ A269;ANAGNI;FR
222
+ A270;ANCARANO;TE
223
+ A271;ANCONA;AN
224
+ A272;ANDALI;CZ
225
+ A274;ANDALO;TN
226
+ A273;ANDALO;VA
227
+ A275;ANDEZENO;TO
228
+ A278;ANDORA;SV
229
+ A280;ANDORNO;MI
230
+ A281;ANDRANO;LE
231
+ A282;ANDRATE;TO
232
+ A283;ANDREIS;PN
233
+ A284;ANDRETTA;AV
234
+ A285;ANDRIA;BA
235
+ A286;ANDRIANO .ANDRIAN.;BZ
236
+ A287;ANELA;SS
237
+ A288;ANFO;BS
238
+ A290;ANGERA;VA
239
+ A291;ANGHIARI;AR
240
+ A292;ANGIARI;VR
241
+ A293;ANGOLO;TE
242
+ A294;ANGRI;SA
243
+ A295;ANGROGNA;TO
244
+ A297;ANGUILLARA;SA
245
+ A296;ANGUILLARA;VE
246
+ A299;ANNICCO;CR
247
+ A301;ANNONE;DI
248
+ A302;ANNONE;VE
249
+ A303;ANOIA;RC
250
+ A304;ANTEGNATE;BG
251
+ A306;ANTERIVO .ALTREI.;BZ
252
+ A305;ANTEY-SAINT-ANDRE';AO
253
+ A309;ANTICOLI;CO
254
+ A312;ANTIGNANO;AT
255
+ A313;ANTILLO;ME
256
+ A314;ANTONIMINA;RC
257
+ A315;ANTRODOCO;RI
258
+ A317;ANTRONA;SC
259
+ A318;ANVERSA;DE
260
+ A319;ANZANO;DE
261
+ A320;ANZANO;DI
262
+ A321;ANZI;PZ
263
+ A323;ANZIO;RM
264
+ A324;ANZOLA;DE
265
+ A325;ANZOLA D'OSSOLA;VB
266
+ A326;AOSTA;AO
267
+ A327;APECCHIO;PU
268
+ A328;APICE;BN
269
+ A329;APIRO;MC
270
+ A330;APOLLOSA;BN
271
+ A333;APPIANO;GE
272
+ A332;APPIANO;SU
273
+ A334;APPIGNANO;MC
274
+ A335;APPIGNANO;DE
275
+ A337;APRICA;SO
276
+ A338;APRICALE;IM
277
+ A339;APRICENA;FG
278
+ A340;APRIGLIANO;CS
279
+ A341;APRILIA;LT
280
+ A343;AQUARA;SA
281
+ A344;AQUILA D'ARROSCIA;IM
282
+ A346;AQUILEIA;UD
283
+ A347;AQUILONIA;AV
284
+ A348;AQUINO;FR
285
+ A350;ARADEO;LE
286
+ A351;ARAGONA;AG
287
+ A352;ARAMENGO;AT
288
+ A354;ARBA;PN
289
+ A357;ARBOREA;OR
290
+ A358;ARBORIO;VC
291
+ A359;ARBUS;CA
292
+ A360;ARCADE;TV
293
+ A363;ARCE;FR
294
+ A365;ARCENE;BG
295
+ A366;ARCEVIA;AN
296
+ A367;ARCHI;CH
297
+ A369;ARCIDOSSO;GR
298
+ A370;ARCINAZZO;RO
299
+ A371;ARCISATE;VA
300
+ A372;ARCO;TN
301
+ A373;ARCOLA;SP
302
+ A374;ARCOLE;VR
303
+ A375;ARCONATE;MI
304
+ A376;ARCORE;MI
305
+ A377;ARCUGNANO;VI
306
+ A379;ARDARA;SS
307
+ A380;ARDAULI;OR
308
+ M213;ARDEA;RM
309
+ A382;ARDENNO;SO
310
+ A383;ARDESIO;BG
311
+ A385;ARDORE;RC
312
+ A386;ARENA;VV
313
+ A387;ARENA;PO
314
+ A388;ARENZANO;GE
315
+ A389;ARESE;MI
316
+ A390;AREZZO;AR
317
+ A391;ARGEGNO;CO
318
+ A392;ARGELATO;BO
319
+ A393;ARGENTA;FE
320
+ A394;ARGENTERA;CN
321
+ A396;ARGUELLO;CN
322
+ A397;ARGUSTO;CZ
323
+ A398;ARI;CH
324
+ A399;ARIANO;IR
325
+ A400;ARIANO;NE
326
+ A401;ARICCIA;RM
327
+ A402;ARIELLI;CH
328
+ A403;ARIENZO;CE
329
+ A405;ARIGNANO;TO
330
+ A407;ARITZO;NU
331
+ A409;ARIZZANO;VB
332
+ A412;ARLENA;DI
333
+ A413;ARLUNO;MI
334
+ A414;ARMENO;NO
335
+ A415;ARMENTO;PZ
336
+ A418;ARMO;IM
337
+ A419;ARMUNGIA;CA
338
+ A424;ARNAD;AO
339
+ A421;ARNARA;FR
340
+ A422;ARNASCO;SV
341
+ A425;ARNESANO;LE
342
+ A427;AROLA;VB
343
+ A429;ARONA;NO
344
+ A430;AROSIO;CO
345
+ A431;ARPAIA;BN
346
+ A432;ARPAISE;BN
347
+ A433;ARPINO;FR
348
+ A434;ARQUA';PE
349
+ A435;ARQUA';PO
350
+ A437;ARQUATA;DE
351
+ A436;ARQUATA;SC
352
+ A438;ARRE;PD
353
+ A439;ARRONE;TR
354
+ A441;ARSAGO;SE
355
+ A443;ARSIE';BL
356
+ A444;ARSIERO;VI
357
+ A445;ARSITA;TE
358
+ A446;ARSOLI;RM
359
+ A447;ARTA;TE
360
+ A448;ARTEGNA;UD
361
+ A449;ARTENA;RM
362
+ A451;ARTOGNE;BS
363
+ A452;ARVIER;AO
364
+ A453;ARZACHENA;SS
365
+ A440;ARZAGO D'ADDA;BG
366
+ A454;ARZANA;NU
367
+ A455;ARZANO;NA
368
+ A456;ARZENE;PN
369
+ A458;ARZERGRANDE;PD
370
+ A459;ARZIGNANO;VI
371
+ A460;ASCEA;SA
372
+ A461;ASCIANO;SI
373
+ A462;ASCOLI;PI
374
+ A463;ASCOLI;SA
375
+ A464;ASCREA;RI
376
+ A465;ASIAGO;VI
377
+ A467;ASIGLIANO;VE
378
+ A466;ASIGLIANO;VE
379
+ A470;ASOLA;MN
380
+ A471;ASOLO;TV
381
+ A473;ASSAGO;MI
382
+ A474;ASSEMINI;CA
383
+ A475;ASSISI;PG
384
+ A476;ASSO;CO
385
+ A477;ASSOLO;OR
386
+ A478;ASSORO;EN
387
+ A479;ASTI;AT
388
+ A480;ASUNI;OR
389
+ A481;ATELETA;AQ
390
+ A482;ATELLA;PZ
391
+ A484;ATENA;LU
392
+ A485;ATESSA;CH
393
+ A486;ATINA;FR
394
+ A487;ATRANI;SA
395
+ A488;ATRI;TE
396
+ A489;ATRIPALDA;AV
397
+ A490;ATTIGLIANO;TR
398
+ A491;ATTIMIS;UD
399
+ A492;ATZARA;NU
400
+ A493;AUDITORE;PU
401
+ A494;AUGUSTA;SR
402
+ A495;AULETTA;SA
403
+ A496;AULLA;MS
404
+ A497;AURANO;VB
405
+ A499;AURIGO;IM
406
+ A501;AURONZO;DI
407
+ A502;AUSONIA;FR
408
+ A503;AUSTIS;NU
409
+ A506;AVEGNO;GE
410
+ A507;AVELENGO .HAFLING.;BZ
411
+ A508;AVELLA;AV
412
+ A509;AVELLINO;AV
413
+ A511;AVERARA;BG
414
+ A512;AVERSA;CE
415
+ A514;AVETRANA;TA
416
+ A515;AVEZZANO;AQ
417
+ A516;AVIANO;PN
418
+ A517;AVIATICO;BG
419
+ A518;AVIGLIANA;TO
420
+ A519;AVIGLIANO;PZ
421
+ M258;AVIGLIANO;UM
422
+ A520;AVIO;TN
423
+ A521;AVISE;AO
424
+ A522;AVOLA;SR
425
+ A523;AVOLASCA;AL
426
+ A094;AYAS;AO
427
+ A108;AYMAVILLES;AO
428
+ A525;AZEGLIO;TO
429
+ A526;AZZANELLO;CR
430
+ A527;AZZANO D'ASTI;AT
431
+ A530;AZZANO;DE
432
+ A529;AZZANO;ME
433
+ A528;AZZANO;SA
434
+ A531;AZZATE;VA
435
+ A532;AZZIO;VA
436
+ A533;AZZONE;BG