MPE Home Metamath Proof Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >  dprdsn Structured version   Visualization version   GIF version

Theorem dprdsn 20282
Description: A singleton family is an internal direct product, the product of which is the given subgroup. (Contributed by Mario Carneiro, 25-Apr-2016.)
Assertion
Ref Expression
dprdsn ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺dom DProd {⟨𝐴, 𝑆⟩} ∧ (𝐺 DProd {⟨𝐴, 𝑆⟩}) = 𝑆))

Proof of Theorem dprdsn
Dummy variables 𝑥 𝑦 are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 eqid 2763 . . 3 (Cntz‘𝐺) = (Cntz‘𝐺)
2 eqid 2763 . . 3 (0g‘𝐺) = (0g‘𝐺)
3 eqid 2763 . . 3 (mrCls‘(SubGrp‘𝐺)) = (mrCls‘(SubGrp‘𝐺))
4 subgrcl 19370 . . . 4 (𝑆 ∈ (SubGrp‘𝐺) → 𝐺 ∈ Grp)
54adantl 487 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → 𝐺 ∈ Grp)
6 snex 5401 . . . 4 {𝐴} ∈ V
76a1i 11 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {𝐴} ∈ V)
8 f1osng 6890 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {⟨𝐴, 𝑆⟩}:{𝐴}⟶1-1onto{𝑆})
9 f1of 6846 . . . . 5 ({⟨𝐴, 𝑆⟩}:{𝐴}⟶1-1onto{𝑆} → {⟨𝐴, 𝑆⟩}:{𝐴}⟶{𝑆})
108, 9syl 18 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {⟨𝐴, 𝑆⟩}:{𝐴}⟶{𝑆})
11 simpr 490 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → 𝑆 ∈ (SubGrp‘𝐺))
1211snssd 4747 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {𝑆} ⊆ (SubGrp‘𝐺))
1310, 12fssd 6749 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {⟨𝐴, 𝑆⟩}:{𝐴}⟶(SubGrp‘𝐺))
14 simpr1 1213 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 ∈ {𝐴})
15 elsni 4601 . . . . . 6 (𝑥 ∈ {𝐴} → 𝑥 = 𝐴)
1614, 15syl 18 . . . . 5 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 = 𝐴)
17 simpr2 1214 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑦 ∈ {𝐴})
18 elsni 4601 . . . . . 6 (𝑦 ∈ {𝐴} → 𝑦 = 𝐴)
1917, 18syl 18 . . . . 5 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑦 = 𝐴)
2016, 19eqtr4d 2801 . . . 4 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 = 𝑦)
21 simpr3 1215 . . . 4 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 ≠ 𝑦)
2220, 21pm2.21ddne 3043 . . 3 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → ({⟨𝐴, 𝑆⟩}‘𝑥) ⊆ ((Cntz‘𝐺)‘({⟨𝐴, 𝑆⟩}‘𝑦)))
235adantr 486 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → 𝐺 ∈ Grp)
24 eqid 2763 . . . . . . . . 9 (Base‘𝐺) = (Base‘𝐺)
2524subgacs 19400 . . . . . . . 8 (𝐺 ∈ Grp → (SubGrp‘𝐺) ∈ (ACS‘(Base‘𝐺)))
26 acsmre 17855 . . . . . . . 8 ((SubGrp‘𝐺) ∈ (ACS‘(Base‘𝐺)) → (SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)))
2723, 25, 263syl 19 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)))
2815adantl 487 . . . . . . . . . . . . . . 15 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → 𝑥 = 𝐴)
2928sneqd 4596 . . . . . . . . . . . . . 14 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → {𝑥} = {𝐴})
3029difeq2d 4066 . . . . . . . . . . . . 13 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({𝐴} ∖ {𝑥}) = ({𝐴} ∖ {𝐴}))
31 difid 4328 . . . . . . . . . . . . 13 ({𝐴} ∖ {𝐴}) = ∅
3230, 31eqtrdi 2814 . . . . . . . . . . . 12 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({𝐴} ∖ {𝑥}) = ∅)
3332imaeq2d 6064 . . . . . . . . . . 11 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ({⟨𝐴, 𝑆⟩} “ ∅))
34 ima0 6087 . . . . . . . . . . 11 ({⟨𝐴, 𝑆⟩} “ ∅) = ∅
3533, 34eqtrdi 2814 . . . . . . . . . 10 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ∅)
3635unieqd 4883 . . . . . . . . 9 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ∪ ∅)
37 uni0 4899 . . . . . . . . 9 ∪ ∅ = ∅
3836, 37eqtrdi 2814 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ∅)
39 0ss 4353 . . . . . . . . 9 ∅ ⊆ {(0g‘𝐺)}
4039a1i 11 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∅ ⊆ {(0g‘𝐺)})
4138, 40eqsstrd 3947 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) ⊆ {(0g‘𝐺)})
4220subg 19391 . . . . . . . 8 (𝐺 ∈ Grp → {(0g‘𝐺)} ∈ (SubGrp‘𝐺))
4323, 42syl 18 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → {(0g‘𝐺)} ∈ (SubGrp‘𝐺))
443mrcsscl 17823 . . . . . . 7 (((SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)) ∧ ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) ⊆ {(0g‘𝐺)} ∧ {(0g‘𝐺)} ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ {(0g‘𝐺)})
4527, 41, 43, 44syl3anc 1399 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ {(0g‘𝐺)})
462subg0cl 19373 . . . . . . . . 9 (𝑆 ∈ (SubGrp‘𝐺) → (0g‘𝐺) ∈ 𝑆)
4746ad2antlr 740 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (0g‘𝐺) ∈ 𝑆)
4815fveq2d 6912 . . . . . . . . 9 (𝑥 ∈ {𝐴} → ({⟨𝐴, 𝑆⟩}‘𝑥) = ({⟨𝐴, 𝑆⟩}‘𝐴))
49 fvsng 7208 . . . . . . . . 9 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ({⟨𝐴, 𝑆⟩}‘𝐴) = 𝑆)
5048, 49sylan9eqr 2820 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({⟨𝐴, 𝑆⟩}‘𝑥) = 𝑆)
5147, 50eleqtrrd 2867 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (0g‘𝐺) ∈ ({⟨𝐴, 𝑆⟩}‘𝑥))
5251snssd 4747 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → {(0g‘𝐺)} ⊆ ({⟨𝐴, 𝑆⟩}‘𝑥))
5345, 52sstrd 3923 . . . . 5 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ ({⟨𝐴, 𝑆⟩}‘𝑥))
54 sseqin2 4123 . . . . 5 (((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ ({⟨𝐴, 𝑆⟩}‘𝑥) ↔ (({⟨𝐴, 𝑆⟩}‘𝑥) ∩ ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})))) = ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))))
5553, 54sylib 221 . . . 4 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (({⟨𝐴, 𝑆⟩}‘𝑥) ∩ ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})))) = ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))))
5655, 45eqsstrd 3947 . . 3 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (({⟨𝐴, 𝑆⟩}‘𝑥) ∩ ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})))) ⊆ {(0g‘𝐺)})
571, 2, 3, 5, 7, 13, 22, 56dmdprdd 20245 . 2 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → 𝐺dom DProd {⟨𝐴, 𝑆⟩})
583dprdspan 20273 . . . 4 (𝐺dom DProd {⟨𝐴, 𝑆⟩} → (𝐺 DProd {⟨𝐴, 𝑆⟩}) = ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}))
5957, 58syl 18 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺 DProd {⟨𝐴, 𝑆⟩}) = ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}))
60 rnsnopg 6235 . . . . . . . 8 (𝐴 ∈ 𝑉 → ran {⟨𝐴, 𝑆⟩} = {𝑆})
6160adantr 486 . . . . . . 7 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ran {⟨𝐴, 𝑆⟩} = {𝑆})
6261unieqd 4883 . . . . . 6 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ∪ ran {⟨𝐴, 𝑆⟩} = ∪ {𝑆})
63 unisng 4888 . . . . . . 7 (𝑆 ∈ (SubGrp‘𝐺) → ∪ {𝑆} = 𝑆)
6463adantl 487 . . . . . 6 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ∪ {𝑆} = 𝑆)
6562, 64eqtrd 2798 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ∪ ran {⟨𝐴, 𝑆⟩} = 𝑆)
6665fveq2d 6912 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}) = ((mrCls‘(SubGrp‘𝐺))‘𝑆))
675, 25, 263syl 19 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)))
683mrcid 17816 . . . . 5 (((SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)) ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘𝑆) = 𝑆)
6967, 68sylancom 600 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘𝑆) = 𝑆)
7066, 69eqtrd 2798 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}) = 𝑆)
7159, 70eqtrd 2798 . 2 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺 DProd {⟨𝐴, 𝑆⟩}) = 𝑆)
7257, 71jca 521 1 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺dom DProd {⟨𝐴, 𝑆⟩} ∧ (𝐺 DProd {⟨𝐴, 𝑆⟩}) = 𝑆))
Colors of variables:    wff setvar class
This proof depends on syntax axioms:   → wi 4   ∧ wa 401   ∧ w3a 1103   = wceq 1570   ∈ wcel 2147   ≠ wne 2959  Vcvv 3454   ⊆ wss 3900   ∖ cdif 4048   ∩ cin 4092  ∅c0 4281  {csn 4588  ⟨cop 4838  ∪ cuni 4870   class class class wbr 5106  dom cdm 5655  ran crn 5656   “ cima 5658  ⟶wf 6554  ⟶1-1ontowf1o 6557  ‘cfv 6558  (class class class)co 7443  Basecbs 17416  0gc0g 17639  Moorecmre 17781  mrClscmrc 17782  ACScacs 17784  Grpcgrp 19173  SubGrpcsubg 19359  Cntzccntz 19559   DProd cdprd 20239
This proof depends on axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1828  ax-4 1842  ax-5 1945  ax-6 2002  ax-7 2043  ax-8 2149  ax-9 2157  ax-10 2180  ax-11 2197  ax-12 2216  ax-ext 2735  ax-rep 5235  ax-sep 5252  ax-nul 5263  ax-pow 5331  ax-pr 5395  ax-un 7775  ax-cnex 11283  ax-resscn 11284  ax-1cn 11285  ax-icn 11286  ax-addcl 11287  ax-addrcl 11288  ax-mulcl 11289  ax-mulrcl 11290  ax-mulcom 11291  ax-addass 11292  ax-mulass 11293  ax-distr 11294  ax-i2m1 11295  ax-1ne0 11296  ax-1rid 11297  ax-rnegex 11298  ax-rrecex 11299  ax-cnre 11300  ax-pre-lttri 11301  ax-pre-lttrn 11302  ax-pre-ltadd 11303  ax-pre-mulgt0 11304
This proof depends on definitions:  df-bi 210  df-an 402  df-or 862  df-3or 1104  df-3an 1105  df-tru 1573  df-fal 1583  df-ex 1813  df-nf 1817  df-sb 2102  df-mo 2567  df-eu 2597  df-clab 2742  df-cleq 2755  df-clel 2839  df-nfc 2913  df-ne 2960  df-nel 3066  df-ral 3081  df-rex 3091  df-rmo 3369  df-reu 3370  df-rab 3417  df-v 3456  df-sbc 3743  df-csb 3852  df-ss 3901  df-pss 4017  df-dif 4050  df-in 4094  df-un 4154  df-nul 4282  df-if 4486  df-pw 4562  df-sn 4589  df-pr 4591  df-op 4839  df-uni 4871  df-int 4911  df-iun 4956  df-iin 4957  df-br 5107  df-opab 5171  df-mpt 5190  df-tr 5216  df-id 5550  df-eprel 5555  df-po 5563  df-so 5564  df-fr 5608  df-se 5609  df-we 5610  df-xp 5661  df-rel 5662  df-cnv 5663  df-co 5664  df-dm 5665  df-rn 5666  df-res 5667  df-ima 5668  df-pred 6322  df-ord 6383  df-on 6384  df-lim 6385  df-suc 6386  df-iota 6512  df-fun 6560  df-fn 6561  df-f 6562  df-f1 6563  df-fo 6564  df-f1o 6565  df-fv 6566  df-isom 6567  df-riota 7400  df-ov 7446  df-oprab 7447  df-mpo 7448  df-of 7717  df-om 7902  df-1st 8025  df-2nd 8026  df-supp 8205  df-tpos 8271  df-frecs 8327  df-wrecs 8358  df-recs 8407  df-rdg 8446  df-1o 8504  df-2o 8505  df-er 8745  df-map 8877  df-ixp 8954  df-en 9002  df-dom 9003  df-sdom 9004  df-fin 9005  df-fsupp 9382  df-oi 9531  df-card 10047  df-pnf 11372  df-mnf 11373  df-xr 11374  df-ltxr 11375  df-le 11376  df-sub 11570  df-neg 11571  df-nn 12363  df-2 12432  df-n0 12634  df-z 12721  df-uz 12993  df-fz 13667  df-fzo 13816  df-seq 14172  df-hash 14502  df-sets 17371  df-slot 17389  df-ndx 17401  df-base 17417  df-ress 17438  df-plusg 17470  df-0g 17641  df-gsum 17642  df-mre 17785  df-mrc 17786  df-acs 17788  df-mgm 18845  df-sgrp 18937  df-mnd 18953  df-mhm 19007  df-submnd 19008  df-grp 19176  df-minusg 19177  df-sbg 19178  df-mulg 19307  df-subg 19362  df-ghm 19457  df-gim 19502  df-cntz 19561  df-oppg 19590  df-cmn 20026  df-dprd 20241
This theorem is used by:  dprd2da  20288  dmdprdpr  20295  dprdpr  20296  dpjlem  20297  pgpfaclem1  20327
  Copyright terms: Public domain W3C validator