Advertisement
johnburn

Untitled

Apr 9th, 2012
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 55.20 KB | None | 0 0
  1. <?php
  2.  
  3. class idnhandler
  4. {
  5.  
  6.     private $_punycode_prefix = "xn--";
  7.     private $_invalid_ucs = 2.14748e+009;
  8.     private $_max_ucs = 1114111;
  9.     private $_base = 36;
  10.     private $_tmin = 1;
  11.     private $_tmax = 26;
  12.     private $_skew = 38;
  13.     private $_damp = 700;
  14.     private $_initial_bias = 72;
  15.     private $_initial_n = 128;
  16.     private $_sbase = 44032;
  17.     private $_lbase = 4352;
  18.     private $_vbase = 4449;
  19.     private $_tbase = 4519;
  20.     private $_lcount = 19;
  21.     private $_vcount = 21;
  22.     private $_tcount = 28;
  23.     private $_ncount = 588;
  24.     private $_scount = 11172;
  25.     private $_error = false;
  26.     private $_api_encoding = "utf8";
  27.     private $_allow_overlong = false;
  28.     private $_strict_mode = false;
  29.     private $NP = array( 'map_nothing' => array( 173, 847, 6150, 6155, 6156, 6157, 8203, 8204, 8205, 8288, 65024, 65025, 65026, 65027, 65028, 65029, 65030, 65031, 65032, 65033, 65034, 65035, 65036, 65037, 65038, 65039, 65279 ), 'general_prohibited' => array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126, 127, 12290 ), 'prohibit' => array( 160, 832, 833, 1757, 1807, 5760, 6158, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8232, 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8287, 8298, 8299, 8300, 8301, 8302, 8303, 12288, 65279, 65529, 65530, 65531, 65532, 65533, 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214, 393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894, 720895, 786430, 786431, 851966, 851967, 917502, 917503, 917505, 983038, 983039, 1048574, 1048575, 1114110, 1114111 ), 'prohibit_ranges' => array( array( 128, 159 ), array( 8288, 8303 ), array( 119155, 119162 ), array( 57344, 63743 ), array( 983040, 1048573 ), array( 1048576, 1114109 ), array( 64976, 65007 ), array( 55296, 57343 ), array( 12272, 12283 ), array( 917536, 917631 ) ), 'replacemaps' => array( array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 956 ), array( 224 ), array( 225 ), array( 226 ), array( 227 ), array( 228 ), array( 229 ), array( 230 ), array( 231 ), array( 232 ), array( 233 ), array( 234 ), array( 235 ), array( 236 ), array( 237 ), array( 238 ), array( 239 ), array( 240 ), array( 241 ), array( 242 ), array( 243 ), array( 244 ), array( 245 ), array( 246 ), array( 248 ), array( 249 ), array( 250 ), array( 251 ), array( 252 ), array( 253 ), array( 254 ), array( 115, 115 ), array( 257 ), array( 259 ), array( 261 ), array( 263 ), array( 265 ), array( 267 ), array( 269 ), array( 271 ), array( 273 ), array( 275 ), array( 277 ), array( 279 ), array( 281 ), array( 283 ), array( 285 ), array( 287 ), array( 289 ), array( 291 ), array( 293 ), array( 295 ), array( 297 ), array( 299 ), array( 301 ), array( 303 ), array( 105, 775 ), array( 307 ), array( 309 ), array( 311 ), array( 314 ), array( 316 ), array( 318 ), array( 320 ), array( 322 ), array( 324 ), array( 326 ), array( 328 ), array( 700, 110 ), array( 331 ), array( 333 ), array( 335 ), array( 337 ), array( 339 ), array( 341 ), array( 343 ), array( 345 ), array( 347 ), array( 349 ), array( 351 ), array( 353 ), array( 355 ), array( 357 ), array( 359 ), array( 361 ), array( 363 ), array( 365 ), array( 367 ), array( 369 ), array( 371 ), array( 373 ), array( 375 ), array( 255 ), array( 378 ), array( 380 ), array( 382 ), array( 115 ), array( 595 ), array( 387 ), array( 389 ), array( 596 ), array( 392 ), array( 598 ), array( 599 ), array( 396 ), array( 477 ), array( 601 ), array( 603 ), array( 402 ), array( 608 ), array( 611 ), array( 617 ), array( 616 ), array( 409 ), array( 623 ), array( 626 ), array( 629 ), array( 417 ), array( 419 ), array( 421 ), array( 640 ), array( 424 ), array( 643 ), array( 429 ), array( 648 ), array( 432 ), array( 650 ), array( 651 ), array( 436 ), array( 438 ), array( 658 ), array( 441 ), array( 445 ), array( 454 ), array( 454 ), array( 457 ), array( 457 ), array( 460 ), array( 460 ), array( 462 ), array( 464 ), array( 466 ), array( 468 ), array( 470 ), array( 472 ), array( 474 ), array( 476 ), array( 479 ), array( 481 ), array( 483 ), array( 485 ), array( 487 ), array( 489 ), array( 491 ), array( 493 ), array( 495 ), array( 106, 780 ), array( 499 ), array( 499 ), array( 501 ), array( 405 ), array( 447 ), array( 505 ), array( 507 ), array( 509 ), array( 511 ), array( 513 ), array( 515 ), array( 517 ), array( 519 ), array( 521 ), array( 523 ), array( 525 ), array( 527 ), array( 529 ), array( 531 ), array( 533 ), array( 535 ), array( 537 ), array( 539 ), array( 541 ), array( 543 ), array( 414 ), array( 547 ), array( 549 ), array( 551 ), array( 553 ), array( 555 ), array( 557 ), array( 559 ), array( 561 ), array( 563 ), array( 953 ), array( 32, 953 ), array( 940 ), array( 941 ), array( 942 ), array( 943 ), array( 972 ), array( 973 ), array( 974 ), array( 953, 776, 769 ), array( 945 ), array( 946 ), array( 947 ), array( 948 ), array( 949 ), array( 950 ), array( 951 ), array( 952 ), array( 953 ), array( 954 ), array( 955 ), array( 956 ), array( 957 ), array( 958 ), array( 959 ), array( 960 ), array( 961 ), array( 963 ), array( 964 ), array( 965 ), array( 966 ), array( 967 ), array( 968 ), array( 969 ), array( 970 ), array( 971 ), array( 965, 776, 769 ), array( 963 ), array( 946 ), array( 952 ), array( 965 ), array( 973 ), array( 971 ), array( 966 ), array( 960 ), array( 985 ), array( 987 ), array( 989 ), array( 991 ), array( 993 ), array( 995 ), array( 997 ), array( 999 ), array( 1001 ), array( 1003 ), array( 1005 ), array( 1007 ), array( 954 ), array( 961 ), array( 963 ), array( 952 ), array( 949 ), array( 1104 ), array( 1105 ), array( 1106 ), array( 1107 ), array( 1108 ), array( 1109 ), array( 1110 ), array( 1111 ), array( 1112 ), array( 1113 ), array( 1114 ), array( 1115 ), array( 1116 ), array( 1117 ), array( 1118 ), array( 1119 ), array( 1072 ), array( 1073 ), array( 1074 ), array( 1075 ), array( 1076 ), array( 1077 ), array( 1078 ), array( 1079 ), array( 1080 ), array( 1081 ), array( 1082 ), array( 1083 ), array( 1084 ), array( 1085 ), array( 1086 ), array( 1087 ), array( 1088 ), array( 1089 ), array( 1090 ), array( 1091 ), array( 1092 ), array( 1093 ), array( 1094 ), array( 1095 ), array( 1096 ), array( 1097 ), array( 1098 ), array( 1099 ), array( 1100 ), array( 1101 ), array( 1102 ), array( 1103 ), array( 1121 ), array( 1123 ), array( 1125 ), array( 1127 ), array( 1129 ), array( 1131 ), array( 1133 ), array( 1135 ), array( 1137 ), array( 1139 ), array( 1141 ), array( 1143 ), array( 1145 ), array( 1147 ), array( 1149 ), array( 1151 ), array( 1153 ), array( 1163 ), array( 1165 ), array( 1167 ), array( 1169 ), array( 1171 ), array( 1173 ), array( 1175 ), array( 1177 ), array( 1179 ), array( 1181 ), array( 1183 ), array( 1185 ), array( 1187 ), array( 1189 ), array( 1191 ), array( 1193 ), array( 1195 ), array( 1197 ), array( 1199 ), array( 1201 ), array( 1203 ), array( 1205 ), array( 1207 ), array( 1209 ), array( 1211 ), array( 1213 ), array( 1215 ), array( 1218 ), array( 1220 ), array( 1222 ), array( 1224 ), array( 1226 ), array( 1228 ), array( 1230 ), array( 1233 ), array( 1235 ), array( 1237 ), array( 1239 ), array( 1241 ), array( 1243 ), array( 1245 ), array( 1247 ), array( 1249 ), array( 1251 ), array( 1253 ), array( 1255 ), array( 1257 ), array( 1259 ), array( 1261 ), array( 1263 ), array( 1265 ), array( 1267 ), array( 1269 ), array( 1273 ), array( 1281 ), array( 1283 ), array( 1285 ), array( 1287 ), array( 1289 ), array( 1291 ), array( 1293 ), array( 1295 ), array( 1377 ), array( 1378 ), array( 1379 ), array( 1380 ), array( 1381 ), array( 1382 ), array( 1383 ), array( 1384 ), array( 1385 ), array( 1386 ), array( 1387 ), array( 1388 ), array( 1389 ), array( 1390 ), array( 1391 ), array( 1392 ), array( 1393 ), array( 1394 ), array( 1395 ), array( 1396 ), array( 1397 ), array( 1398 ), array( 1399 ), array( 1400 ), array( 1401 ), array( 1402 ), array( 1403 ), array( 1404 ), array( 1405 ), array( 1406 ), array( 1407 ), array( 1408 ), array( 1409 ), array( 1410 ), array( 1411 ), array( 1412 ), array( 1413 ), array( 1414 ), array( 1381, 1410 ), array( 3661, 3634 ), array( 7681 ), array( 7683 ), array( 7685 ), array( 7687 ), array( 7689 ), array( 7691 ), array( 7693 ), array( 7695 ), array( 7697 ), array( 7699 ), array( 7701 ), array( 7703 ), array( 7705 ), array( 7707 ), array( 7709 ), array( 7711 ), array( 7713 ), array( 7715 ), array( 7717 ), array( 7719 ), array( 7721 ), array( 7723 ), array( 7725 ), array( 7727 ), array( 7729 ), array( 7731 ), array( 7733 ), array( 7735 ), array( 7737 ), array( 7739 ), array( 7741 ), array( 7743 ), array( 7745 ), array( 7747 ), array( 7749 ), array( 7751 ), array( 7753 ), array( 7755 ), array( 7757 ), array( 7759 ), array( 7761 ), array( 7763 ), array( 7765 ), array( 7767 ), array( 7769 ), array( 7771 ), array( 7773 ), array( 7775 ), array( 7777 ), array( 7779 ), array( 7781 ), array( 7783 ), array( 7785 ), array( 7787 ), array( 7789 ), array( 7791 ), array( 7793 ), array( 7795 ), array( 7797 ), array( 7799 ), array( 7801 ), array( 7803 ), array( 7805 ), array( 7807 ), array( 7809 ), array( 7811 ), array( 7813 ), array( 7815 ), array( 7817 ), array( 7819 ), array( 7821 ), array( 7823 ), array( 7825 ), array( 7827 ), array( 7829 ), array( 104, 817 ), array( 116, 776 ), array( 119, 778 ), array( 121, 778 ), array( 97, 702 ), array( 7777 ), array( 7841 ), array( 7843 ), array( 7845 ), array( 7847 ), array( 7849 ), array( 7851 ), array( 7853 ), array( 7855 ), array( 7857 ), array( 7859 ), array( 7861 ), array( 7863 ), array( 7865 ), array( 7867 ), array( 7869 ), array( 7871 ), array( 7873 ), array( 7875 ), array( 7877 ), array( 7879 ), array( 7881 ), array( 7883 ), array( 7885 ), array( 7887 ), array( 7889 ), array( 7891 ), array( 7893 ), array( 7895 ), array( 7897 ), array( 7899 ), array( 7901 ), array( 7903 ), array( 7905 ), array( 7907 ), array( 7909 ), array( 7911 ), array( 7913 ), array( 7915 ), array( 7917 ), array( 7919 ), array( 7921 ), array( 7923 ), array( 7925 ), array( 7927 ), array( 7929 ), array( 7936 ), array( 7937 ), array( 7938 ), array( 7939 ), array( 7940 ), array( 7941 ), array( 7942 ), array( 7943 ), array( 7952 ), array( 7953 ), array( 7954 ), array( 7955 ), array( 7956 ), array( 7957 ), array( 7968 ), array( 7969 ), array( 7970 ), array( 7971 ), array( 7972 ), array( 7973 ), array( 7974 ), array( 7975 ), array( 7984 ), array( 7985 ), array( 7986 ), array( 7987 ), array( 7988 ), array( 7989 ), array( 7990 ), array( 7991 ), array( 8000 ), array( 8001 ), array( 8002 ), array( 8003 ), array( 8004 ), array( 8005 ), array( 965, 787 ), array( 965, 787, 768 ), array( 965, 787, 769 ), array( 965, 787, 834 ), array( 8017 ), array( 8019 ), array( 8021 ), array( 8023 ), array( 8032 ), array( 8033 ), array( 8034 ), array( 8035 ), array( 8036 ), array( 8037 ), array( 8038 ), array( 8039 ), array( 7936, 953 ), array( 7937, 953 ), array( 7938, 953 ), array( 7939, 953 ), array( 7940, 953 ), array( 7941, 953 ), array( 7942, 953 ), array( 7943, 953 ), array( 7936, 953 ), array( 7937, 953 ), array( 7938, 953 ), array( 7939, 953 ), array( 7940, 953 ), array( 7941, 953 ), array( 7942, 953 ), array( 7943, 953 ), array( 7968, 953 ), array( 7969, 953 ), array( 7970, 953 ), array( 7971, 953 ), array( 7972, 953 ), array( 7973, 953 ), array( 7974, 953 ), array( 7975, 953 ), array( 7968, 953 ), array( 7969, 953 ), array( 7970, 953 ), array( 7971, 953 ), array( 7972, 953 ), array( 7973, 953 ), array( 7974, 953 ), array( 7975, 953 ), array( 8032, 953 ), array( 8033, 953 ), array( 8034, 953 ), array( 8035, 953 ), array( 8036, 953 ), array( 8037, 953 ), array( 8038, 953 ), array( 8039, 953 ), array( 8032, 953 ), array( 8033, 953 ), array( 8034, 953 ), array( 8035, 953 ), array( 8036, 953 ), array( 8037, 953 ), array( 8038, 953 ), array( 8039, 953 ), array( 8048, 953 ), array( 945, 953 ), array( 940, 953 ), array( 945, 834 ), array( 945, 834, 953 ), array( 8112 ), array( 8113 ), array( 8048 ), array( 8049 ), array( 945, 953 ), array( 953 ), array( 8052, 953 ), array( 951, 953 ), array( 942, 953 ), array( 951, 834 ), array( 951, 834, 953 ), array( 8050 ), array( 8051 ), array( 8052 ), array( 8053 ), array( 951, 953 ), array( 953, 776, 768 ), array( 953, 776, 769 ), array( 953, 834 ), array( 953, 776, 834 ), array( 8144 ), array( 8145 ), array( 8054 ), array( 8055 ), array( 965, 776, 768 ), array( 965, 776, 769 ), array( 961, 787 ), array( 965, 834 ), array( 965, 776, 834 ), array( 8160 ), array( 8161 ), array( 8058 ), array( 8059 ), array( 8165 ), array( 8060, 953 ), array( 969, 953 ), array( 974, 953 ), array( 969, 834 ), array( 969, 834, 953 ), array( 8056 ), array( 8057 ), array( 8060 ), array( 8061 ), array( 969, 953 ), array( 114, 115 ), array( 99 ), array( 176, 99 ), array( 603 ), array( 176, 102 ), array( 104 ), array( 104 ), array( 104 ), array( 105 ), array( 105 ), array( 108 ), array( 110 ), array( 110, 111 ), array( 112 ), array( 113 ), array( 114 ), array( 114 ), array( 114 ), array( 115, 109 ), array( 116, 101, 108 ), array( 116, 109 ), array( 122 ), array( 969 ), array( 122 ), array( 107 ), array( 229 ), array( 98 ), array( 99 ), array( 101 ), array( 102 ), array( 109 ), array( 947 ), array( 960 ), array( 100 ), array( 8560 ), array( 8561 ), array( 8562 ), array( 8563 ), array( 8564 ), array( 8565 ), array( 8566 ), array( 8567 ), array( 8568 ), array( 8569 ), array( 8570 ), array( 8571 ), array( 8572 ), array( 8573 ), array( 8574 ), array( 8575 ), array( 9424 ), array( 9425 ), array( 9426 ), array( 9427 ), array( 9428 ), array( 9429 ), array( 9430 ), array( 9431 ), array( 9432 ), array( 9433 ), array( 9434 ), array( 9435 ), array( 9436 ), array( 9437 ), array( 9438 ), array( 9439 ), array( 9440 ), array( 9441 ), array( 9442 ), array( 9443 ), array( 9444 ), array( 9445 ), array( 9446 ), array( 9447 ), array( 9448 ), array( 9449 ), array( 104, 112, 97 ), array( 97, 117 ), array( 111, 118 ), array( 112, 97 ), array( 110, 97 ), array( 956, 97 ), array( 109, 97 ), array( 107, 97 ), array( 107, 98 ), array( 109, 98 ), array( 103, 98 ), array( 112, 102 ), array( 110, 102 ), array( 956, 102 ), array( 104, 122 ), array( 107, 104, 122 ), array( 109, 104, 122 ), array( 103, 104, 122 ), array( 116, 104, 122 ), array( 112, 97 ), array( 107, 112, 97 ), array( 109, 112, 97 ), array( 103, 112, 97 ), array( 112, 118 ), array( 110, 118 ), array( 956, 118 ), array( 109, 118 ), array( 107, 118 ), array( 109, 118 ), array( 112, 119 ), array( 110, 119 ), array( 956, 119 ), array( 109, 119 ), array( 107, 119 ), array( 109, 119 ), array( 107, 969 ), array( 109, 969 ), array( 98, 113 ), array( 99, 8725, 107, 103 ), array( 99, 111, 46 ), array( 100, 98 ), array( 103, 121 ), array( 104, 112 ), array( 107, 107 ), array( 107, 109 ), array( 112, 104 ), array( 112, 112, 109 ), array( 112, 114 ), array( 115, 118 ), array( 119, 98 ), array( 102, 102 ), array( 102, 105 ), array( 102, 108 ), array( 102, 102, 105 ), array( 102, 102, 108 ), array( 115, 116 ), array( 115, 116 ), array( 1396, 1398 ), array( 1396, 1381 ), array( 1396, 1387 ), array( 1406, 1398 ), array( 1396, 1389 ), array( 65345 ), array( 65346 ), array( 65347 ), array( 65348 ), array( 65349 ), array( 65350 ), array( 65351 ), array( 65352 ), array( 65353 ), array( 65354 ), array( 65355 ), array( 65356 ), array( 65357 ), array( 65358 ), array( 65359 ), array( 65360 ), array( 65361 ), array( 65362 ), array( 65363 ), array( 65364 ), array( 65365 ), array( 65366 ), array( 65367 ), array( 65368 ), array( 65369 ), array( 65370 ), array( 66600 ), array( 66601 ), array( 66602 ), array( 66603 ), array( 66604 ), array( 66605 ), array( 66606 ), array( 66607 ), array( 66608 ), array( 66609 ), array( 66610 ), array( 66611 ), array( 66612 ), array( 66613 ), array( 66614 ), array( 66615 ), array( 66616 ), array( 66617 ), array( 66618 ), array( 66619 ), array( 66620 ), array( 66621 ), array( 66622 ), array( 66623 ), array( 66624 ), array( 66625 ), array( 66626 ), array( 66627 ), array( 66628 ), array( 66629 ), array( 66630 ), array( 66631 ), array( 66632 ), array( 66633 ), array( 66634 ), array( 66635 ), array( 66636 ), array( 66637 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 99 ), array( 100 ), array( 103 ), array( 106 ), array( 107 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 97 ), array( 98 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 111 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 97 ), array( 98 ), array( 99 ), array( 100 ), array( 101 ), array( 102 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 112 ), array( 113 ), array( 114 ), array( 115 ), array( 116 ), array( 117 ), array( 118 ), array( 119 ), array( 120 ), array( 121 ), array( 122 ), array( 945 ), array( 946 ), array( 947 ), array( 948 ), array( 949 ), array( 950 ), array( 951 ), array( 952 ), array( 953 ), array( 954 ), array( 955 ), array( 956 ), array( 957 ), array( 958 ), array( 959 ), array( 960 ), array( 961 ), array( 952 ), array( 963 ), array( 964 ), array( 965 ), array( 966 ), array( 967 ), array( 968 ), array( 969 ), array( 963 ), array( 945 ), array( 946 ), array( 947 ), array( 948 ), array( 949 ), array( 950 ), array( 951 ), array( 952 ), array( 953 ), array( 954 ), array( 955 ), array( 956 ), array( 957 ), array( 958 ), array( 959 ), array( 960 ), array( 961 ), array( 952 ), array( 963 ), array( 964 ), array( 965 ), array( 966 ), array( 967 ), array( 968 ), array( 969 ), array( 963 ), array( 945 ), array( 946 ), array( 947 ), array( 948 ), array( 949 ), array( 950 ), array( 951 ), array( 952 ), array( 953 ), array( 954 ), array( 955 ), array( 956 ), array( 957 ), array( 958 ), array( 959 ), array( 960 ), array( 961 ), array( 952 ), array( 963 ), array( 964 ), array( 965 ), array( 966 ), array( 967 ), array( 968 ), array( 969 ), array( 963 ), array( 945 ), array( 946 ), array( 947 ), array( 948 ), array( 949 ), array( 950 ), array( 951 ), array( 952 ), array( 953 ), array( 954 ), array( 955 ), array( 956 ), array( 957 ), array( 958 ), array( 959 ), array( 960 ), array( 961 ), array( 952 ), array( 963 ), array( 964 ), array( 965 ), array( 966 ), array( 967 ), array( 968 ), array( 969 ), array( 963 ), array( 945 ), array( 946 ), array( 947 ), array( 948 ), array( 949 ), array( 950 ), array( 951 ), array( 952 ), array( 953 ), array( 954 ), array( 955 ), array( 956 ), array( 957 ), array( 958 ), array( 959 ), array( 960 ), array( 961 ), array( 952 ), array( 963 ), array( 964 ), array( 965 ), array( 966 ), array( 967 ), array( 968 ), array( 969 ), array( 963 ), array( 963 ), array( 97 ), array( 230 ), array( 98 ), array( 100 ), array( 101 ), array( 477 ), array( 103 ), array( 104 ), array( 105 ), array( 106 ), array( 107 ), array( 108 ), array( 109 ), array( 110 ), array( 111 ), array( 547 ), array( 112 ), array( 114 ), array( 116 ), array( 117 ), array( 119 ), array( 102, 97, 120 ), array( 112, 116, 101 ), array( 104, 103 ), array( 101, 118 ), array( 108, 116, 100 ), array( 105, 117 ), array( 118, 8725, 109 ), array( 97, 8725, 109 ) ), 'norm_combcls' => array( 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 84, 91, 103, 103, 107, 107, 107, 107, 118, 118, 122, 122, 122, 122, 129, 130, 130, 130, 130, 130, 130, 132, 202, 202, 202, 202, 216, 216, 216, 216, 216, 216, 216, 216, 216, 218, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 222, 222, 222, 222, 224, 224, 226, 228, 228, 228, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 232, 232, 232, 233, 233, 234, 234, 234, 234, 240 ) );
  30.  
  31.     public function __construct( $options = false )
  32.     {
  33.         $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
  34.         if ( is_array( $options ) )
  35.         {
  36.             return $this->set_parameter( $options );
  37.         }
  38.         return true;
  39.     }
  40.  
  41.     public function set_parameter( $option, $value = false )
  42.     {
  43.         if ( !is_array( $option ) )
  44.         {
  45.             $option = array( $option => $value );
  46.         }
  47.         foreach ( $option as $k => $v )
  48.         {
  49.             switch ( $k )
  50.             {
  51.                 case "encoding" :
  52.                     switch ( $v )
  53.                     {
  54.                         case "utf8" :
  55.                         case "ucs4_string" :
  56.                         case "ucs4_array" :
  57.                             $this->_api_encoding = $Var_576;
  58.                             break;
  59.                             $this->_error( "Set Parameter: Unknown parameter ".$v." for option ".$k );
  60.                             return false;
  61.                     }
  62.                     break;
  63.                 case "overlong" :
  64.                     $this->_allow_overlong = $v ? true : false;
  65.                     break;
  66.                 case "strict" :
  67.                     $this->_strict_mode = $v ? true : false;
  68.                     break;
  69.             }
  70.             $this->_error( "Set Parameter: Unknown option ".$k );
  71.             return false;
  72.         }
  73.         return true;
  74.     }
  75.  
  76.     public function decode( $input, $one_time_encoding = false )
  77.     {
  78.         if ( $one_time_encoding )
  79.         {
  80.             switch ( $one_time_encoding )
  81.             {
  82.                 case "utf8" :
  83.                     break;
  84.                 case "ucs4_string" :
  85.                     break;
  86.                 case "ucs4_array" :
  87.             }
  88.             break;
  89.             $this->_error( "Unknown encoding ".$one_time_encoding );
  90.             return false;
  91.         }
  92.         $input = trim( $input );
  93.         if ( strpos( $input, "@" ) )
  94.         {
  95.             if ( $this->_strict_mode )
  96.             {
  97.                 $this->_error( "Only simple domain name parts can be handled in strict mode" );
  98.                 return false;
  99.             }
  100.             $input = explode( "@", $input, 2 )[1];
  101.             $email_pref = explode( "@", $input, 2 )[0];
  102.             $arr = explode( ".", $input );
  103.             foreach ( $arr as $k => $v )
  104.             {
  105.                 if ( preg_match( "!^".preg_quote( $this->_punycode_prefix, "!" )."!", $v ) )
  106.                 {
  107.                     $conv = $this->_decode( $v );
  108.                     if ( $conv )
  109.                     {
  110.                         $arr[$k] = $conv;
  111.                     }
  112.                 }
  113.             }
  114.             $input = join( ".", $arr );
  115.             $arr = explode( ".", $email_pref );
  116.             foreach ( $arr as $k => $v )
  117.             {
  118.                 if ( preg_match( "!^".preg_quote( $this->_punycode_prefix, "!" )."!", $v ) )
  119.                 {
  120.                     $conv = $this->_decode( $v );
  121.                     if ( $conv )
  122.                     {
  123.                         $arr[$k] = $conv;
  124.                     }
  125.                 }
  126.             }
  127.             $email_pref = join( ".", $arr );
  128.             $return = $email_pref."@".$input;
  129.         }
  130.         else if ( preg_match( "![:\\./]!", $input ) )
  131.         {
  132.             if ( $this->_strict_mode )
  133.             {
  134.                 $this->_error( "Only simple domain name parts can be handled in strict mode" );
  135.                 return false;
  136.             }
  137.             $parsed = parse_url( $input );
  138.             if ( isset( $parsed['host'] ) )
  139.             {
  140.                 $arr = explode( ".", $parsed['host'] );
  141.                 foreach ( $arr as $k => $v )
  142.                 {
  143.                     $conv = $this->_decode( $v );
  144.                     if ( $conv )
  145.                     {
  146.                         $arr[$k] = $conv;
  147.                     }
  148.                 }
  149.                 $parsed['host'] = join( ".", $arr );
  150.                 $return = ( empty( $parsed['scheme'] ) ? "" : $parsed['scheme'].( strtolower( $parsed['scheme'] ) == "mailto" ? ":" : "://" ) ).( empty( $parsed['user'] ) ? "" : $parsed['user'].( empty( $parsed['pass'] ) ? "" : ":".$parsed['pass'] )."@" ).$parsed['host'].( empty( $parsed['port'] ) ? "" : ":".$parsed['port'] ).( empty( $parsed['path'] ) ? "" : $parsed['path'] ).( empty( $parsed['query'] ) ? "" : "?".$parsed['query'] ).( empty( $parsed['fragment'] ) ? "" : "#".$parsed['fragment'] );
  151.             }
  152.             else
  153.             {
  154.                 $arr = explode( ".", $input );
  155.                 foreach ( $arr as $k => $v )
  156.                 {
  157.                     $conv = $this->_decode( $v );
  158.                     $arr[$k] = $conv ? $conv : $v;
  159.                 }
  160.                 $return = join( ".", $arr );
  161.             }
  162.         }
  163.         else
  164.         {
  165.             $return = $this->_decode( $input );
  166.             if ( !$return )
  167.             {
  168.                 $return = $input;
  169.             }
  170.         }
  171.         switch ( $one_time_encoding ? $one_time_encoding : $this->_api_encoding )
  172.         {
  173.             case "utf8" :
  174.                 return $return;
  175.             case "ucs4_string" :
  176.                 return $this->_ucs4_to_ucs4_string( $this->_utf8_to_ucs4( $return ) );
  177.             case "ucs4_array" :
  178.                 return $this->_utf8_to_ucs4( $return );
  179.         }
  180.         $this->_error( "Unsupported output format" );
  181.         return false;
  182.     }
  183.  
  184.     public function encode( $decoded, $one_time_encoding = false )
  185.     {
  186.         switch ( $one_time_encoding ? $one_time_encoding : $this->_api_encoding )
  187.         {
  188.             case "utf8" :
  189.                 $decoded = $this->_utf8_to_ucs4( $decoded );
  190.                 break;
  191.             case "ucs4_string" :
  192.                 $decoded = $this->_ucs4_string_to_ucs4( $decoded );
  193.                 break;
  194.             case "ucs4_array" :
  195.         }
  196.         break;
  197.         $this->_error( "Unsupported input format: ".( $one_time_encoding ? $one_time_encoding : $this->_api_encoding ) );
  198.         return false;
  199.         if ( empty( $decoded ) )
  200.         {
  201.             return "";
  202.         }
  203.         $last_begin = 0;
  204.         $output = "";
  205.         foreach ( $decoded as $k => $v )
  206.         {
  207.             switch ( $v )
  208.             {
  209.                 case 12290 :
  210.                 case 65294 :
  211.                 case 65377 :
  212.                     $decoded[$k] = 46;
  213.                     break;
  214.                 case 46 :
  215.                     break;
  216.                 case 47 :
  217.                     break;
  218.                 case 58 :
  219.                     break;
  220.                 case 63 :
  221.                     break;
  222.                 case 64 :
  223.             }
  224.             if ( $this->_strict_mode )
  225.             {
  226.                 $this->_error( "Neither email addresses nor URLs are allowed in strict mode." );
  227.                 return false;
  228.             }
  229.             if ( $k )
  230.             {
  231.                 $encoded = "";
  232.                 $encoded = $this->_encode( array_slice( $decoded, $last_begin, $k - $last_begin ) );
  233.                 if ( $encoded )
  234.                 {
  235.                     $output .= $encoded;
  236.                 }
  237.                 else
  238.                 {
  239.                     $output .= $this->_ucs4_to_utf8( array_slice( $decoded, $last_begin, $k - $last_begin ) );
  240.                 }
  241.                 $output .= chr( $decoded[$k] );
  242.             }
  243.             $last_begin = $k + 1;
  244.         }
  245.         if ( $last_begin )
  246.         {
  247.             $inp_len = sizeof( $decoded );
  248.             $encoded = "";
  249.             $encoded = $this->_encode( array_slice( $decoded, $last_begin, $inp_len - $last_begin ) );
  250.             if ( $encoded )
  251.             {
  252.                 $output .= $encoded;
  253.             }
  254.             else
  255.             {
  256.                 $output .= $this->_ucs4_to_utf8( array_slice( $decoded, $last_begin, $inp_len - $last_begin ) );
  257.             }
  258.             return $output;
  259.         }
  260.         if ( $output = $this->_encode( $decoded ) )
  261.         {
  262.             return $output;
  263.         }
  264.         return $this->_ucs4_to_utf8( $decoded );
  265.     }
  266.  
  267.     public function get_last_error( )
  268.     {
  269.         return $this->_error;
  270.     }
  271.  
  272.     private function _decode( $encoded )
  273.     {
  274.         $decoded = array( );
  275.         if ( !preg_match( "!^".preg_quote( $this->_punycode_prefix, "!" )."!", $encoded ) )
  276.         {
  277.             $this->_error( "This is not a punycode string" );
  278.             return false;
  279.         }
  280.         $encode_test = preg_replace( "!^".preg_quote( $this->_punycode_prefix, "!" )."!", "", $encoded );
  281.         if ( !$encode_test )
  282.         {
  283.             $this->_error( "The given encoded string was empty" );
  284.             return false;
  285.         }
  286.         $delim_pos = strrpos( $encoded, "-" );
  287.         if ( strlen( $this->_punycode_prefix ) < $delim_pos )
  288.         {
  289.             $k = strlen( $this->_punycode_prefix );
  290.             while ( $k < $delim_pos )
  291.             {
  292.                 $decoded[] = ord( $encoded[$k] );
  293.                 ++$k;
  294.             }
  295.         }
  296.         $deco_len = count( $decoded );
  297.         $enco_len = strlen( $encoded );
  298.         $is_first = true;
  299.         $bias = $this->_initial_bias;
  300.         $idx = 0;
  301.         $char = $this->_initial_n;
  302.         $enco_idx = $delim_pos ? $delim_pos + 1 : 0;
  303.         while ( $enco_idx < $enco_len )
  304.         {
  305.             $old_idx = $idx;
  306.             $w = 1;
  307.             $k = $this->_base;
  308.             while ( 1 )
  309.             {
  310.                 $digit = $this->_decode_digit( $encoded[$enco_idx++] );
  311.                 $idx += $digit * $w;
  312.                 $t = $k <= $bias ? $this->_tmin : $bias + $this->_tmax <= $k ? $this->_tmax : $k - $bias;
  313.                 if ( $digit < $t )
  314.                 {
  315.                     break;
  316.                 }
  317.                 $w = ( integer )( $w * ( $this->_base - $t ) );
  318.                 $k += $this->_base;
  319.             }
  320.             $bias = $this->_adapt( $idx - $old_idx, $deco_len + 1, $is_first );
  321.             $is_first = false;
  322.             $char += ( integer )( $idx / ( $deco_len + 1 ) );
  323.             $idx %= $deco_len + 1;
  324.             if ( 0 < $deco_len )
  325.             {
  326.                 $i = $deco_len;
  327.                 while ( $idx < $i )
  328.                 {
  329.                     $decoded[$i] = $decoded[$i - 1];
  330.                     --$i;
  331.                 }
  332.             }
  333.             $decoded[$idx++] = $char;
  334.             ++$deco_len;
  335.         }
  336.         return $this->_ucs4_to_utf8( $decoded );
  337.     }
  338.  
  339.     private function _encode( $decoded )
  340.     {
  341.         $extract = strlen( $this->_punycode_prefix );
  342.         $check_pref = $this->_utf8_to_ucs4( $this->_punycode_prefix );
  343.         $check_deco = array_slice( $decoded, 0, $extract );
  344.         if ( $check_pref == $check_deco )
  345.         {
  346.             $this->_error( "This is already a punycode string" );
  347.             return false;
  348.         }
  349.         $encodable = false;
  350.         foreach ( $decoded as $k => $v )
  351.         {
  352.             if ( 122 < $v )
  353.             {
  354.                 $encodable = true;
  355.                 break;
  356.                 break;
  357.             }
  358.         }
  359.         if ( !$encodable )
  360.         {
  361.             $this->_error( "The given string does not contain encodable chars" );
  362.             return false;
  363.         }
  364.         $decoded = $this->_nameprep( $decoded );
  365.         if ( !$decoded || !is_array( $decoded ) )
  366.         {
  367.             return false;
  368.         }
  369.         $deco_len = count( $decoded );
  370.         if ( !$deco_len )
  371.         {
  372.             return false;
  373.         }
  374.         $codecount = 0;
  375.         $encoded = "";
  376.         $i = 0;
  377.         while ( $i < $deco_len )
  378.         {
  379.             $test = $decoded[$i];
  380.             if ( 47 < $test && $test < 64 || 64 < $test && $test < 91 || 96 < $test && $test <= 123 || 45 == $test )
  381.             {
  382.                 $encoded .= chr( $decoded[$i] );
  383.                 ++$codecount;
  384.             }
  385.             ++$i;
  386.         }
  387.         if ( $codecount == $deco_len )
  388.         {
  389.             return $encoded;
  390.         }
  391.         $encoded = $this->_punycode_prefix.$encoded;
  392.         if ( $codecount )
  393.         {
  394.             $encoded .= "-";
  395.         }
  396.         $is_first = true;
  397.         $cur_code = $this->_initial_n;
  398.         $bias = $this->_initial_bias;
  399.         $delta = 0;
  400.         while ( $codecount < $deco_len )
  401.         {
  402.             $i = 0;
  403.             $next_code = $this->_max_ucs;
  404.             while ( $i < $deco_len )
  405.             {
  406.                 if ( $cur_code <= $decoded[$i] && $decoded[$i] <= $next_code )
  407.                 {
  408.                     $next_code = $decoded[$i];
  409.                 }
  410.                 ++$i;
  411.             }
  412.             $delta += ( $next_code - $cur_code ) * ( $codecount + 1 );
  413.             $cur_code = $next_code;
  414.             $i = 0;
  415.             do
  416.             {
  417.                 if ( $decoded[$i] < $cur_code )
  418.                 {
  419.                     ++$delta;
  420.                 }
  421.                 if ( $decoded[$i] == $cur_code )
  422.                 {
  423.                     $q = $delta;
  424.                     $k = $this->_base;
  425.                     while ( 1 )
  426.                     {
  427.                         $t = $k <= $bias ? $this->_tmin : $bias + $this->_tmax <= $k ? $this->_tmax : $k - $bias;
  428.                         if ( $q < $t )
  429.                         {
  430.                             break;
  431.                         }
  432.                         $encoded .= $this->_encode_digit( intval( $t + ( $q - $t ) % ( $this->_base - $t ) ) );
  433.                         $q = ( integer )( ( $q - $t ) / ( $this->_base - $t ) );
  434.                         $k += $this->_base;
  435.                     }
  436.                     $encoded .= $this->_encode_digit( $q );
  437.                     $bias = $this->_adapt( $delta, $codecount + 1, $is_first );
  438.                     ++$codecount;
  439.                     $delta = 0;
  440.                     $is_first = false;
  441.                 }
  442.                 ++$i;
  443.             } while ( 1 );
  444.             ++$delta;
  445.             ++$cur_code;
  446.         }
  447.         return $encoded;
  448.     }
  449.  
  450.     private function _adapt( $delta, $npoints, $is_first )
  451.     {
  452.         $delta = intval( $is_first ? $delta / $this->_damp : $delta / 2 );
  453.         $delta += intval( $delta / $npoints );
  454.         $k = 0;
  455.         while ( ( $this->_base - $this->_tmin ) * $this->_tmax / 2 < $delta )
  456.         {
  457.             $delta = intval( $delta / ( $this->_base - $this->_tmin ) );
  458.             $k += $this->_base;
  459.         }
  460.         return intval( $k + ( $this->_base - $this->_tmin + 1 ) * $delta / ( $delta + $this->_skew ) );
  461.     }
  462.  
  463.     private function _encode_digit( $d )
  464.     {
  465.         return chr( $d + 22 + 75 * ( $d < 26 ) );
  466.     }
  467.  
  468.     private function _decode_digit( $cp )
  469.     {
  470.         $cp = ord( $cp );
  471.         return $cp - 48 < 10 ? $cp - 22 : $cp - 65 < 26 ? $cp - 65 : $cp - 97 < 26 ? $cp - 97 : $this->_base;
  472.     }
  473.  
  474.     private function _error( $error = "" )
  475.     {
  476.         $this->_error = $error;
  477.     }
  478.  
  479.     private function _nameprep( $input )
  480.     {
  481.         $output = array( );
  482.         $error = false;
  483.         foreach ( $input as $v )
  484.         {
  485.             if ( in_array( $v, $this->NP['map_nothing'] ) )
  486.             {
  487.                 continue;
  488.             }
  489.             if ( in_array( $v, $this->NP['prohibit'] ) || in_array( $v, $this->NP['general_prohibited'] ) )
  490.             {
  491.                 $this->_error( "NAMEPREP: Prohibited input U+".sprintf( "%08X", $v ) );
  492.                 return false;
  493.             }
  494.             foreach ( $this->NP['prohibit_ranges'] as $range )
  495.             {
  496.                 if ( $range[0] <= $v && $v <= $range[1] )
  497.                 {
  498.                     $this->_error( "NAMEPREP: Prohibited input U+".sprintf( "%08X", $v ) );
  499.                     return false;
  500.                 }
  501.             }
  502.             if ( 44032 <= $v && $v <= 55215 )
  503.             {
  504.                 foreach ( $this->_hangul_decompose( $v ) as $out )
  505.                 {
  506.                     $output[] = ( integer );
  507.                 }
  508.             }
  509.             else if ( isset( $this->NP['replacemaps'][$v] ) )
  510.             {
  511.                 foreach ( $this->_apply_cannonical_ordering( $this->NP['replacemaps'][$v] ) as $out )
  512.                 {
  513.                     $output[] = ( integer );
  514.                 }
  515.             }
  516.             else
  517.             {
  518.                 $output[] = ( integer );
  519.             }
  520.         }
  521.         $output = $this->_hangul_compose( $output );
  522.         $last_class = 0;
  523.         $last_starter = 0;
  524.         $out_len = count( $output );
  525.         $i = 0;
  526.         while ( $i < $out_len )
  527.         {
  528.             $class = $this->_get_combining_class( $output[$i] );
  529.             if ( ( !$last_class || $class < $last_class ) && $class )
  530.             {
  531.                 $seq_len = $i - $last_starter;
  532.                 $out = $this->_combine( array_slice( $output, $last_starter, $seq_len ) );
  533.                 if ( $out )
  534.                 {
  535.                     $output[$last_starter] = $out;
  536.                     if ( count( $out ) != $seq_len )
  537.                     {
  538.                         $j = $i + 1;
  539.                         while ( $j < $out_len )
  540.                         {
  541.                             $output[$j - 1] = $output[$j];
  542.                             ++$j;
  543.                         }
  544.                         unset( $output[$out_len] );
  545.                     }
  546.                     --$i;
  547.                     --$out_len;
  548.                     $last_class = $i == $last_starter ? 0 : $this->_get_combining_class( $output[$i - 1] );
  549.                     continue;
  550.                 }
  551.             }
  552.             if ( !$class )
  553.             {
  554.                 $last_starter = $i;
  555.             }
  556.             $last_class = $class;
  557.             ++$i;
  558.         }
  559.         return $output;
  560.     }
  561.  
  562.     private function _hangul_decompose( $char )
  563.     {
  564.         $sindex = ( integer ) - $this->_sbase;
  565.         if ( $sindex < 0 || $this->_scount <= $sindex )
  566.         {
  567.             return array( $char );
  568.         }
  569.         $result = array( );
  570.         $result[] = ( integer ) + $sindex / $this->_ncount;
  571.         $result[] = ( integer ) + $sindex % $this->_ncount / $this->_tcount;
  572.         $T = intval( $this->_tbase + $sindex % $this->_tcount );
  573.         if ( $T != $this->_tbase )
  574.         {
  575.             $result[] = $T;
  576.         }
  577.         return $result;
  578.     }
  579.  
  580.     private function _hangul_compose( $input )
  581.     {
  582.         $inp_len = count( $input );
  583.         if ( !$inp_len )
  584.         {
  585.             return array( );
  586.         }
  587.         $result = array( );
  588.         $last = ( integer );
  589.         $result[] = $last;
  590.         $i = 1;
  591.         while ( $i < $inp_len )
  592.         {
  593.             $char = ( integer );
  594.             $sindex = $last - $this->_sbase;
  595.             $lindex = $last - $this->_lbase;
  596.             $vindex = $char - $this->_vbase;
  597.             $tindex = $char - $this->_tbase;
  598.             if ( 0 <= $sindex && $sindex < $this->_scount && $sindex % $this->_tcount == 0 && 0 <= $tindex && $tindex <= $this->_tcount )
  599.             {
  600.                 $last += $tindex;
  601.                 $result[count( $result ) - 1] = $last;
  602.                 continue;
  603.             }
  604.             if ( $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount )
  605.             {
  606.                 $last = ( integer ) + ( $lindex * $this->_vcount + $vindex ) * $this->_tcount;
  607.                 $result[count( $result ) - 1] = $last;
  608.                 continue;
  609.             }
  610.             $last = $char;
  611.             $result[] = $char;
  612.             ++$i;
  613.         }
  614.         return $result;
  615.     }
  616.  
  617.     private function _get_combining_class( $char )
  618.     {
  619.         return isset( $this->NP['norm_combcls'][$char] ) ? $this->NP['norm_combcls'][$char] : 0;
  620.     }
  621.  
  622.     private function _apply_cannonical_ordering( $input )
  623.     {
  624.         $swap = true;
  625.         $size = count( $input );
  626.         while ( $swap )
  627.         {
  628.             $swap = false;
  629.             $last = $this->_get_combining_class( intval( $input[0] ) );
  630.             $i = 0;
  631.             do
  632.             {
  633.                 if ( $i < $size - 1 )
  634.                 {
  635.                     $next = $this->_get_combining_class( intval( $input[$i + 1] ) );
  636.                     if ( $next != 0 && $next < $last )
  637.                     {
  638.                         $j = $i + 1;
  639.                         while ( 0 < $j )
  640.                         {
  641.                             if ( $this->_get_combining_class( intval( $input[$j - 1] ) ) <= $next )
  642.                             {
  643.                                 break;
  644.                             }
  645.                             $t = intval( $input[$j] );
  646.                             $input[$j] = intval( $input[$j - 1] );
  647.                             $input[$j - 1] = $t;
  648.                             $swap = true;
  649.                             --$j;
  650.                         }
  651.                         $next = $last;
  652.                     }
  653.                     $last = $next;
  654.                     ++$i;
  655.                 }
  656.             } while ( 1 );
  657.         }
  658.         return $input;
  659.     }
  660.  
  661.     private function _combine( $input )
  662.     {
  663.         $inp_len = count( $input );
  664.         foreach ( $this->NP['replacemaps'] as $np_src => $np_target )
  665.         {
  666.             if ( $np_target[0] != $input[0] )
  667.             {
  668.                 continue;
  669.             }
  670.             if ( count( $np_target ) != $inp_len )
  671.             {
  672.                 continue;
  673.             }
  674.             $hit = false;
  675.             foreach ( $input as $k2 => $v2 )
  676.             {
  677.                 if ( $v2 == $np_target[$k2] )
  678.                 {
  679.                     $hit = true;
  680.                 }
  681.                 else
  682.                 {
  683.                     $hit = false;
  684.                     break;
  685.                     break;
  686.                 }
  687.             }
  688.             if ( $hit )
  689.             {
  690.                 return $np_src;
  691.                 break;
  692.             }
  693.         }
  694.         return false;
  695.     }
  696.  
  697.     private function _utf8_to_ucs4( $input )
  698.     {
  699.         $output = array( );
  700.         $out_len = 0;
  701.         if ( function_exists( "mb_strlen" ) )
  702.         {
  703.             $inp_len = mb_strlen( $input, "8bit" );
  704.         }
  705.         else
  706.         {
  707.             $inp_len = strlen( $input );
  708.         }
  709.         $mode = "next";
  710.         $test = "none";
  711.         $k = 0;
  712.         while ( $k < $inp_len )
  713.         {
  714.             $v = ord( $input[$k] );
  715.             if ( $v < 128 )
  716.             {
  717.                 $output[$out_len] = $v;
  718.                 ++$out_len;
  719.                 if ( "add" == $mode )
  720.                 {
  721.                     $this->_error( "Conversion from UTF-8 to UCS-4 failed: malformed input at byte ".$k );
  722.                     return false;
  723.                 }
  724.                 continue;
  725.             }
  726.             if ( "next" == $mode )
  727.             {
  728.                 $start_byte = $v;
  729.                 $mode = "add";
  730.                 $test = "range";
  731.                 if ( $v >> 5 == 6 )
  732.                 {
  733.                     $next_byte = 0;
  734.                     $v = $v - 192 << 6;
  735.                 }
  736.                 else if ( $v >> 4 == 14 )
  737.                 {
  738.                     $next_byte = 1;
  739.                     $v = $v - 224 << 12;
  740.                 }
  741.                 else if ( $v >> 3 == 30 )
  742.                 {
  743.                     $next_byte = 2;
  744.                     $v = $v - 240 << 18;
  745.                 }
  746.                 else if ( $v >> 2 == 62 )
  747.                 {
  748.                     $next_byte = 3;
  749.                     $v = $v - 248 << 24;
  750.                 }
  751.                 else if ( $v >> 1 == 126 )
  752.                 {
  753.                     $next_byte = 4;
  754.                     $v = $v - 252 << 30;
  755.                 }
  756.                 else
  757.                 {
  758.                     $this->_error( "This might be UTF-8, but I don't understand it at byte ".$k );
  759.                     return false;
  760.                 }
  761.                 if ( "add" == $mode )
  762.                 {
  763.                     $output[$out_len] = ( integer );
  764.                     ++$out_len;
  765.                     continue;
  766.                 }
  767.             }
  768.             if ( "add" == $mode )
  769.             {
  770.                 $test = "none";
  771.                 if ( $v < 160 && $start_byte == 224 || $v < 144 && $start_byte == 240 || 143 < $v && $start_byte == 244 )
  772.                 {
  773.                     $this->_error( "Bogus UTF-8 character detected (out of legal range) at byte ".$k );
  774.                     return false;
  775.                 }
  776.                 if ( $v >> 6 == 2 )
  777.                 {
  778.                     $v = $v - 128 << $next_byte * 6;
  779.                     $output += $out_len - 1;
  780.                     --$next_byte;
  781.                 }
  782.                 else
  783.                 {
  784.                     $this->_error( "Conversion from UTF-8 to UCS-4 failed: malformed input at byte ".$k );
  785.                     return false;
  786.                 }
  787.                 if ( $next_byte < 0 )
  788.                 {
  789.                     $mode = "next";
  790.                 }
  791.             }
  792.             ++$k;
  793.         }
  794.         return $output;
  795.     }
  796.  
  797.     private function _ucs4_to_utf8( $input )
  798.     {
  799.         $output = "";
  800.         foreach ( $input as $k => $v )
  801.         {
  802.             if ( $v < 128 )
  803.             {
  804.                 $output .= chr( $v );
  805.             }
  806.             else if ( $v < 1 << 11 )
  807.             {
  808.                 $output .= chr( 192 + ( $v >> 6 ) ).chr( 128 + ( $v & 63 ) );
  809.             }
  810.             else if ( $v < 1 << 16 )
  811.             {
  812.                 $output .= chr( 224 + ( $v >> 12 ) ).chr( 128 + ( $v >> 6 & 63 ) ).chr( 128 + ( $v & 63 ) );
  813.             }
  814.             else if ( $v < 1 << 21 )
  815.             {
  816.                 $output .= chr( 240 + ( $v >> 18 ) ).chr( 128 + ( $v >> 12 & 63 ) ).chr( 128 + ( $v >> 6 & 63 ) ).chr( 128 + ( $v & 63 ) );
  817.             }
  818.             else if ( self::$safe_mode )
  819.             {
  820.                 $output .= self::$safe_char;
  821.             }
  822.             else
  823.             {
  824.                 $this->_error( "Conversion from UCS-4 to UTF-8 failed: malformed input at byte ".$k );
  825.                 return false;
  826.                 break;
  827.             }
  828.         }
  829.         return $output;
  830.     }
  831.  
  832.     private function _ucs4_to_ucs4_string( $input )
  833.     {
  834.         $output = "";
  835.         foreach ( $input as $v )
  836.         {
  837.             $output .= chr( $v >> 24 & 255 ).chr( $v >> 16 & 255 ).chr( $v >> 8 & 255 ).chr( $v & 255 );
  838.         }
  839.         return $output;
  840.     }
  841.  
  842.     private function _ucs4_string_to_ucs4( $input )
  843.     {
  844.         $output = array( );
  845.         $inp_len = strlen( $input );
  846.         if ( $inp_len % 4 )
  847.         {
  848.             $this->_error( "Input UCS4 string is broken" );
  849.             return false;
  850.         }
  851.         if ( !$inp_len )
  852.         {
  853.             return $output;
  854.         }
  855.         $i = 0;
  856.         $out_len = 0 - 1;
  857.         while ( $i < $inp_len )
  858.         {
  859.             if ( !( $i % 4 ) )
  860.             {
  861.                 ++$out_len;
  862.                 $output[$out_len] = 0;
  863.             }
  864.             $output += $out_len;
  865.             ++$i;
  866.         }
  867.         return $output;
  868.     }
  869.  
  870. }
  871.  
  872. function lookupDomain( $sld, $ext )
  873. {
  874.     global $remote_ip;
  875.     $idnconv = new idnhandler( );
  876.     $sld = $idnconv->encode( $sld );
  877.     $whoisservers = file_get_contents( dirname( __FILE__ )."/whoisservers.php" );
  878.     $whoisservers = explode( "\n", $whoisservers );
  879.     foreach ( $whoisservers as $value )
  880.     {
  881.         $value = explode( "|", $value );
  882.         $tld = trim( strip_tags( $value[0] ) );
  883.         $whoisserver[$tld] = trim( strip_tags( $value[1] ) );
  884.         $whoisvalue[$tld] = trim( strip_tags( $value[2] ) );
  885.         $whoisreqprefix[$tld] = strip_tags( $value[3] );
  886.     }
  887.     $port = "43";
  888.     $server = $whoisserver[$ext];
  889.     $return = $whoisvalue[$ext];
  890.     $reqprefix = $whoisreqprefix[$ext];
  891.     if ( $server == "" )
  892.     {
  893.         $result['result'] = "available";
  894.     }
  895.     else
  896.     {
  897.         $fulldomain = $domain = $sld.$ext;
  898.         if ( substr( $return, 0, 12 ) == "HTTPREQUEST-" )
  899.         {
  900.             $ch = curl_init( );
  901.             $url = $server.$domain;
  902.             curl_setopt( $ch, CURLOPT_URL, $url );
  903.             curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 0 );
  904.             curl_setopt( $ch, CURLOPT_TIMEOUT, 60 );
  905.             curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
  906.             curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
  907.             curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
  908.             $data = curl_exec( $ch );
  909.             curl_close( $ch );
  910.             $data2 = " ---".$data;
  911.             if ( strpos( $data2, substr( $return, 12 ) ) == true )
  912.             {
  913.                 $result['result'] = "available";
  914.             }
  915.             else
  916.             {
  917.                 $result['result'] = "unavailable";
  918.                 $result['whois'] = nl2br( strip_tags( $data ) );
  919.             }
  920.         }
  921.         else
  922.         {
  923.             if ( strpos( $server, ":" ) )
  924.             {
  925.                 $port = explode( ":", $server, 2 );
  926.                 $server = $port[0];
  927.                 $port = $port[1];
  928.             }
  929.             if ( substr( $return, 0, 6 ) == "NOTLD-" )
  930.             {
  931.                 $domain = $sld;
  932.                 $return = substr( $return, 6 );
  933.             }
  934.             $fp = @fsockopen( @$server, @$port, @$errno, @$errstr, 10 );
  935.             if ( $fp )
  936.             {
  937.                 @fputs( @$fp, @$reqprefix.@$domain."\r\n" );
  938.                 @socket_set_timeout( @$fp, 10 );
  939.                 while ( @!feof( @$fp ) )
  940.                 {
  941.                     $data .= @fread( @$fp, 4096 );
  942.                 }
  943.                 @fclose( @$fp );
  944.                 $data2 = " ---".$data;
  945.                 if ( strpos( $data2, $return ) == true )
  946.                 {
  947.                     $result['result'] = "available";
  948.                 }
  949.                 else
  950.                 {
  951.                     $result['result'] = "unavailable";
  952.                     $result['whois'] = nl2br( $data );
  953.                 }
  954.             }
  955.             else
  956.             {
  957.                 $result['result'] = "error";
  958.             }
  959.         }
  960.         insert_query( "tblwhoislog", array( "date" => "now()", "domain" => $fulldomain, "ip" => $remote_ip ) );
  961.     }
  962.     return $result;
  963. }
  964.  
  965. function getWHOISServers( )
  966. {
  967.     $whoisservers = file_get_contents( dirname( __FILE__ )."/whoisservers.php" );
  968.     $whoisservers = explode( "\n", $whoisservers );
  969.     foreach ( $whoisservers as $value )
  970.     {
  971.         $value = explode( "|", $value );
  972.         $whoisserver[trim( strip_tags( $value[0] ) )] = trim( strip_tags( $value[1] ) );
  973.     }
  974.     return $whoisserver;
  975. }
  976.  
  977. function getWHOISServerVars( )
  978. {
  979.     $whoisservers = file_get_contents( dirname( __FILE__ )."/whoisservers.php" );
  980.     $whoisservers = explode( "\n", $whoisservers );
  981.     foreach ( $whoisservers as $value )
  982.     {
  983.         $value = explode( "|", $value );
  984.         $whoisvalue[trim( strip_tags( $value[0] ) )] = trim( strip_tags( $value[2] ) );
  985.     }
  986.     return $whoisvalue;
  987. }
  988.  
  989. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement