Subversion Repositories Kolibri OS

Rev

Rev 171 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 171 Rev 256
Line 187... Line 187...
187
 
187
 
188
    cmp   eax,2
188
    cmp   eax,2
189
    jb    sfc_error
189
    jb    sfc_error
190
    cmp   eax,[LAST_CLUSTER]
190
    cmp   eax,[LAST_CLUSTER]
191
    ja    sfc_error
191
    ja    sfc_error
192
    cmp   [fat_type],16
192
    cmp   [fs_type],16
193
    je    sfc_1
193
    je    sfc_1
194
    add   eax,eax
194
    add   eax,eax
195
  sfc_1:
195
  sfc_1:
196
    add   eax,eax
196
    add   eax,eax
Line 215... Line 215...
215
    cmp  [hd_error],0
215
    cmp  [hd_error],0
216
    jne  sfc_error
216
    jne  sfc_error
Line 217... Line 217...
217
    
217
    
218
 
218
 
219
  sfc_in_cache:
219
  sfc_in_cache:
Line 220... Line 220...
220
    cmp   [fat_type],16
220
    cmp   [fs_type],16
221
    jne   sfc_test32
221
    jne   sfc_test32
222
 
222
 
Line 251... Line 251...
251
; input  : EAX = cluster
251
; input  : EAX = cluster
252
; output : EAX = next cluster
252
; output : EAX = next cluster
253
;--------------------------------
253
;--------------------------------
254
    push  ebx esi
254
    push  ebx esi
Line 255... Line 255...
255
 
255
 
256
    cmp   [fat_type],16
256
    cmp   [fs_type],16
257
    je    gfc_1
257
    je    gfc_1
258
    add   eax,eax
258
    add   eax,eax
259
  gfc_1:
259
  gfc_1:
260
    add   eax,eax
260
    add   eax,eax
Line 379... Line 379...
379
    ja    adr_not_found         ; too big cluster number, something is wrong
379
    ja    adr_not_found         ; too big cluster number, something is wrong
380
    cmp   eax,2
380
    cmp   eax,2
381
    jnb   adr_data_cluster
381
    jnb   adr_data_cluster
Line 382... Line 382...
382
 
382
 
383
    mov   eax,[ROOT_CLUSTER]    ; if cluster < 2 then read rootdir
383
    mov   eax,[ROOT_CLUSTER]    ; if cluster < 2 then read rootdir
384
    cmp   [fat_type],16
384
    cmp   [fs_type],16
385
    jne   adr_data_cluster
385
    jne   adr_data_cluster
386
    mov   eax,[ROOT_START]
386
    mov   eax,[ROOT_START]
387
    mov   edx,[ROOT_SECTORS]
387
    mov   edx,[ROOT_SECTORS]
388
    mov   [fat16_root],1        ; flag for fat16 rootdir
388
    mov   [fat16_root],1        ; flag for fat16 rootdir
Line 474... Line 474...
474
    ja    adw_not_found         ; too big cluster number, something is wrong
474
    ja    adw_not_found         ; too big cluster number, something is wrong
475
    cmp   eax,2
475
    cmp   eax,2
476
    jnb   adw_data_cluster
476
    jnb   adw_data_cluster
Line 477... Line 477...
477
 
477
 
478
    mov   eax,[ROOT_CLUSTER]    ; if cluster < 2 then read rootdir
478
    mov   eax,[ROOT_CLUSTER]    ; if cluster < 2 then read rootdir
479
    cmp   [fat_type],16
479
    cmp   [fs_type],16
480
    jne   adw_data_cluster
480
    jne   adw_data_cluster
481
    mov   eax,[ROOT_START]
481
    mov   eax,[ROOT_START]
482
    mov   edx,[ROOT_SECTORS]
482
    mov   edx,[ROOT_SECTORS]
483
    mov   [fat16_root],1        ; flag for fat16 rootdir
483
    mov   [fat16_root],1        ; flag for fat16 rootdir
Line 597... Line 597...
597
    ja    gdc_error             ; too big cluster number, something is wrong
597
    ja    gdc_error             ; too big cluster number, something is wrong
598
    cmp   eax,2
598
    cmp   eax,2
599
    jnb   gdc_cluster
599
    jnb   gdc_cluster
Line 600... Line 600...
600
 
600
 
601
    mov   eax,[ROOT_CLUSTER]    ; if cluster < 2 then read rootdir
601
    mov   eax,[ROOT_CLUSTER]    ; if cluster < 2 then read rootdir
602
    cmp   [fat_type],16
602
    cmp   [fs_type],16
603
    jne   gdc_cluster
603
    jne   gdc_cluster
604
    mov   eax,[ROOT_START]
604
    mov   eax,[ROOT_START]
605
    mov   ecx,[ROOT_SECTORS]    ; Note: not cluster size
605
    mov   ecx,[ROOT_SECTORS]    ; Note: not cluster size
606
    mov   [fat16_root],1        ; flag for fat16 rootdir
606
    mov   [fat16_root],1        ; flag for fat16 rootdir
Line 815... Line 815...
815
;                5 - file not found
815
;                5 - file not found
816
;                8 - disk full
816
;                8 - disk full
817
;               10 - access denied
817
;               10 - access denied
818
; Note   : can only make one directory at time
818
; Note   : can only make one directory at time
819
;-----------------------------------------------------
819
;-----------------------------------------------------
820
    cmp   [fat_type],0
820
        cmp     [fs_type], 16
821
    jnz   make_dir_fat_ok
821
        jz      make_dir_fat_ok
-
 
822
        cmp     [fs_type], 32
-
 
823
        jz      make_dir_fat_ok
822
    mov   eax,ERROR_UNKNOWN_FS
824
        push    ERROR_UNKNOWN_FS
-
 
825
        pop     eax
823
    ret
826
        ret
Line 824... Line 827...
824
 
827
 
825
  make_dir_fat_ok:
828
  make_dir_fat_ok:
Line 993... Line 996...
993
; Note   : negative = remove clusters from free space
996
; Note   : negative = remove clusters from free space
994
;          positive = add clusters to free space
997
;          positive = add clusters to free space
995
;-----------------------------------------------------
998
;-----------------------------------------------------
996
    test  ecx,ecx               ; no change
999
    test  ecx,ecx               ; no change
997
    je    add_dfs_no
1000
    je    add_dfs_no
998
    cmp   [fat_type],32         ; free disk space only used by fat32
1001
    cmp   [fs_type],32         ; free disk space only used by fat32
999
    jne   add_dfs_no
1002
    jne   add_dfs_no
Line 1000... Line 1003...
1000
 
1003
 
1001
    push  eax ebx
1004
    push  eax ebx
1002
    mov   eax,[ADR_FSINFO]
1005
    mov   eax,[ADR_FSINFO]
Line 1034... Line 1037...
1034
;                3 - unknown FS
1037
;                3 - unknown FS
1035
;                5 - file not found
1038
;                5 - file not found
1036
;                8 - disk full
1039
;                8 - disk full
1037
;               10 - access denied
1040
;               10 - access denied
1038
;--------------------------------------------------------------------------
1041
;--------------------------------------------------------------------------
-
 
1042
        cmp     [fs_type], 16
-
 
1043
        jz      fat_ok_for_writing
1039
    cmp   [fat_type],0
1044
        cmp     [fs_type], 32
1040
    jnz   fat_ok_for_writing
1045
        jz      fat_ok_for_writing
1041
    mov   eax,ERROR_UNKNOWN_FS
1046
        push    ERROR_UNKNOWN_FS
-
 
1047
        pop     eax
1042
    ret
1048
        ret
Line 1043... Line 1049...
1043
 
1049
 
1044
  fat_ok_for_writing:
1050
  fat_ok_for_writing:
Line 1220... Line 1226...
1220
;                6 - end of file
1226
;                6 - end of file
1221
;                9 - fat table corrupted
1227
;                9 - fat table corrupted
1222
;               10 - access denied
1228
;               10 - access denied
1223
;          ebx = size of file/directory
1229
;          ebx = size of file/directory
1224
;--------------------------------------------------------------------------
1230
;--------------------------------------------------------------------------
-
 
1231
        cmp     [fs_type], 16
-
 
1232
        jz      fat_ok_for_reading
1225
    cmp   [fat_type],0
1233
        cmp     [fs_type], 32
1226
    jnz   fat_ok_for_reading
1234
        jz      fat_ok_for_reading
1227
    xor   ebx,ebx
1235
    xor   ebx,ebx
1228
    mov   eax,ERROR_UNKNOWN_FS
1236
    mov   eax,ERROR_UNKNOWN_FS
1229
    mov   [hd1_status], ebx
1237
    mov   [hd1_status], ebx
1230
    ret
1238
    ret
Line 1342... Line 1350...
1342
    test  eax,eax
1350
    test  eax,eax
1343
    jnz   dir_size_next
1351
    jnz   dir_size_next
Line 1344... Line 1352...
1344
 
1352
 
1345
    mov   eax,[ROOT_SECTORS]
1353
    mov   eax,[ROOT_SECTORS]
1346
    shl   eax,9                 ; fat16 rootdir size in bytes
1354
    shl   eax,9                 ; fat16 rootdir size in bytes
1347
    cmp   [fat_type],16
1355
    cmp   [fs_type],16
1348
    je    dir_size_ret
1356
    je    dir_size_ret
Line 1349... Line 1357...
1349
    mov   eax,[ROOT_CLUSTER]
1357
    mov   eax,[ROOT_CLUSTER]
1350
 
1358
 
Line 1377... Line 1385...
1377
; output : eax = 0 - ok
1385
; output : eax = 0 - ok
1378
;                3 - unknown FS
1386
;                3 - unknown FS
1379
;                5 - file not found
1387
;                5 - file not found
1380
;               10 - access denied
1388
;               10 - access denied
1381
;-----------------------------------------------------
1389
;-----------------------------------------------------
1382
    cmp   [fat_type],0
1390
        cmp     [fs_type], 16
1383
    jnz   file_del_fat_ok
1391
        jz      file_del_fat_ok
-
 
1392
        cmp     [fs_type], 32
-
 
1393
        jz      file_del_fat_ok
1384
    mov   eax,ERROR_UNKNOWN_FS
1394
        push    ERROR_UNKNOWN_FS
-
 
1395
        pop     eax
1385
    ret
1396
        ret
Line 1386... Line 1397...
1386
 
1397
 
1387
  file_del_fat_ok:
1398
  file_del_fat_ok:
Line 1663... Line 1674...
1663
;                3 - unknown FS
1674
;                3 - unknown FS
1664
;                5 - file not found
1675
;                5 - file not found
1665
;                8 - disk full
1676
;                8 - disk full
1666
;               10 - access denied
1677
;               10 - access denied
1667
;-----------------------------------------------------------
1678
;-----------------------------------------------------------
1668
    cmp   [fat_type],0
1679
        cmp     [fs_type], 16
1669
    jnz   fat_ok_for_rename
1680
        jz      fat_ok_for_rename
-
 
1681
        cmp     [fs_type], 32
-
 
1682
        jz      fat_ok_for_rename
1670
    mov   eax,ERROR_UNKNOWN_FS
1683
        push    ERROR_UNKNOWN_FS
-
 
1684
        pop     eax
1671
    ret
1685
        ret
Line 1672... Line 1686...
1672
 
1686
 
1673
  fat_ok_for_rename:
1687
  fat_ok_for_rename:
Line 1823... Line 1837...
1823
;               10 - access denied
1837
;               10 - access denied
1824
;          edx = cluster size in bytes
1838
;          edx = cluster size in bytes
1825
;          ebx = total clusters on disk
1839
;          ebx = total clusters on disk
1826
;          ecx = free clusters on disk
1840
;          ecx = free clusters on disk
1827
;-----------------------------------------------------------
1841
;-----------------------------------------------------------
-
 
1842
        cmp     [fs_type], 16
-
 
1843
        jz      info_fat_ok
1828
    cmp   [fat_type],0
1844
        cmp     [fs_type], 32
1829
    jnz   info_fat_ok
1845
        jz      info_fat_ok
1830
    xor   edx,edx
1846
    xor   edx,edx
1831
    xor   ebx,ebx
1847
    xor   ebx,ebx
1832
    xor   ecx,ecx
1848
    xor   ecx,ecx
1833
    mov   eax,ERROR_UNKNOWN_FS
1849
    mov   eax,ERROR_UNKNOWN_FS
1834
    ret
1850
    ret
Line 1947... Line 1963...
1947
        push    0
1963
        push    0
1948
        push    0
1964
        push    0
1949
        push    fat16_root_first
1965
        push    fat16_root_first
1950
        push    fat16_root_next
1966
        push    fat16_root_next
1951
        mov     eax, [ROOT_CLUSTER]
1967
        mov     eax, [ROOT_CLUSTER]
1952
        cmp     [fat_type], 32
1968
        cmp     [fs_type], 32
1953
        jz      .fat32
1969
        jz      .fat32
1954
.loop:
1970
.loop:
1955
        call    fat_find_lfn
1971
        call    fat_find_lfn
1956
        jc      .notfound
1972
        jc      .notfound
1957
        cmp     byte [esi], 0
1973
        cmp     byte [esi], 0
Line 1998... Line 2014...
1998
;  ret ebx = bytes read or 0xffffffff file not found
2014
;  ret ebx = bytes read or 0xffffffff file not found
1999
;      eax = 0 ok read or other = errormsg
2015
;      eax = 0 ok read or other = errormsg
2000
;
2016
;
2001
;--------------------------------------------------------------
2017
;--------------------------------------------------------------
2002
fs_HdRead:
2018
fs_HdRead:
2003
    cmp    [fat_type], 0
2019
        cmp     [fs_type], 16
2004
    jnz    @f
2020
        jz      @f
-
 
2021
        cmp     [fs_type], 32
-
 
2022
        jz      @f
-
 
2023
        cmp     [fs_type], 1
-
 
2024
        jz      ntfs_HdRead
2005
    or    ebx, -1
2025
        or      ebx, -1
2006
    mov    eax, ERROR_UNKNOWN_FS
2026
        mov     eax, ERROR_UNKNOWN_FS
2007
    ret
2027
        ret
2008
@@:
2028
@@:
2009
    push    edi
2029
    push    edi
Line 2153... Line 2173...
2153
;  ret ebx = blocks read or 0xffffffff folder not found
2173
;  ret ebx = blocks read or 0xffffffff folder not found
2154
;      eax = 0 ok read or other = errormsg
2174
;      eax = 0 ok read or other = errormsg
2155
;
2175
;
2156
;--------------------------------------------------------------
2176
;--------------------------------------------------------------
2157
fs_HdReadFolder:
2177
fs_HdReadFolder:
-
 
2178
        cmp     [fs_type], 1
-
 
2179
        jz      ntfs_HdReadFolder
-
 
2180
        cmp     [fs_type], 16
-
 
2181
        jz      @f
-
 
2182
        cmp     [fs_type], 32
-
 
2183
        jz      @f
-
 
2184
        push    ERROR_UNSUPPORTED_FS
-
 
2185
        pop     eax
-
 
2186
        or      ebx, -1
-
 
2187
        ret
-
 
2188
@@:
2158
        mov     eax, [ROOT_CLUSTER]
2189
        mov     eax, [ROOT_CLUSTER]
2159
        push    edi
2190
        push    edi
2160
        cmp     byte [esi], 0
2191
        cmp     byte [esi], 0
2161
        jz      .doit
2192
        jz      .doit
2162
        call    hd_find_lfn
2193
        call    hd_find_lfn
Line 2193... Line 2224...
2193
        mov     esi, edi        ; esi points to BDFE
2224
        mov     esi, edi        ; esi points to BDFE
2194
.new_cluster:
2225
.new_cluster:
2195
        mov     [cluster_tmp], eax
2226
        mov     [cluster_tmp], eax
2196
        test    eax, eax
2227
        test    eax, eax
2197
        jnz     @f
2228
        jnz     @f
2198
        cmp     [fat_type], 32
2229
        cmp     [fs_type], 32
2199
        jz      .notfound
2230
        jz      .notfound
2200
        mov     eax, [ROOT_START]
2231
        mov     eax, [ROOT_START]
2201
        push    [ROOT_SECTORS]
2232
        push    [ROOT_SECTORS]
2202
        push    ebx
2233
        push    ebx
2203
        jmp     .new_sector
2234
        jmp     .new_sector
Line 2523... Line 2554...
2523
        mov     eax, ERROR_UNKNOWN_FS
2554
        mov     eax, ERROR_UNKNOWN_FS
2524
        xor     ebx, ebx
2555
        xor     ebx, ebx
2525
        ret
2556
        ret
Line 2526... Line 2557...
2526
 
2557
 
2527
fs_HdRewrite:
2558
fs_HdRewrite:
-
 
2559
        cmp     [fs_type], 1
-
 
2560
        jz      ntfs_HdRewrite
-
 
2561
        cmp     [fs_type], 16
-
 
2562
        jz      @f
2528
        cmp     [fat_type], 0
2563
        cmp     [fs_type], 32
-
 
2564
        jnz     fshrfs
2529
        jz      fshrfs
2565
@@:
2530
        cmp     byte [esi], 0
2566
        cmp     byte [esi], 0
2531
        jz      fshrad
2567
        jz      fshrad
2532
        pushad
2568
        pushad
2533
        xor     ebp, ebp
2569
        xor     ebp, ebp
Line 2543... Line 2579...
2543
@@:
2579
@@:
2544
        pop     esi
2580
        pop     esi
2545
        test    ebp, ebp
2581
        test    ebp, ebp
2546
        jnz     .noroot
2582
        jnz     .noroot
2547
        mov     ebp, [ROOT_CLUSTER]
2583
        mov     ebp, [ROOT_CLUSTER]
2548
        cmp     [fat_type], 32
2584
        cmp     [fs_type], 32
2549
        jz      .pushnotroot
2585
        jz      .pushnotroot
2550
        push    fat16_root_extend_dir
2586
        push    fat16_root_extend_dir
2551
        push    fat16_root_end_write
2587
        push    fat16_root_end_write
2552
        push    fat16_root_next_write
2588
        push    fat16_root_next_write
2553
        push    fat16_root_begin_write
2589
        push    fat16_root_begin_write
Line 2942... Line 2978...
2942
        popad
2978
        popad
2943
        ret
2979
        ret
Line 2944... Line 2980...
2944
 
2980
 
2945
;----------------------------------------------------------------
2981
;----------------------------------------------------------------
2946
;
2982
;
2947
;  fs_HdWrite - LFN variant for writing to floppy
2983
;  fs_HdWrite - LFN variant for writing to hard disk
2948
;
2984
;
2949
;  esi  points to filename
2985
;  esi  points to filename
2950
;  ebx  pointer to 64-bit number = first wanted byte, 0+
2986
;  ebx  pointer to 64-bit number = first wanted byte, 0+
2951
;       may be ebx=0 - start from first byte
2987
;       may be ebx=0 - start from first byte
Line 2966... Line 3002...
2966
fs_HdWrite.ret11:
3002
fs_HdWrite.ret11:
2967
        push    11
3003
        push    11
2968
        jmp     fs_HdWrite.ret0
3004
        jmp     fs_HdWrite.ret0
Line 2969... Line 3005...
2969
 
3005
 
2970
fs_HdWrite:
3006
fs_HdWrite:
-
 
3007
        cmp     [fs_type], 1
-
 
3008
        jz      ntfs_HdWrite
-
 
3009
        cmp     [fs_type], 16
-
 
3010
        jz      @f
2971
        cmp     [fat_type], 0
3011
        cmp     [fs_type], 32
2972
        jnz     @f
3012
        jz      @f
2973
        push    ERROR_UNKNOWN_FS
3013
        push    ERROR_UNKNOWN_FS
2974
        jmp     .ret0
3014
        jmp     .ret0
2975
@@:
3015
@@:
2976
        cmp     byte [esi], 0
3016
        cmp     byte [esi], 0
Line 3299... Line 3339...
3299
;
3339
;
3300
;  ret eax = 0 ok or other = errormsg
3340
;  ret eax = 0 ok or other = errormsg
3301
;
3341
;
3302
;--------------------------------------------------------------
3342
;--------------------------------------------------------------
3303
fs_HdSetFileEnd:
3343
fs_HdSetFileEnd:
3304
        cmp     [fat_type], 0
3344
        cmp     [fs_type], 1
-
 
3345
        jz      ntfs_HdSetFileEnd
-
 
3346
        cmp     [fs_type], 16
-
 
3347
        jz      @f
-
 
3348
        cmp     [fs_type], 32
3305
        jnz     @f
3349
        jz      @f
3306
        push    ERROR_UNKNOWN_FS
3350
        push    ERROR_UNKNOWN_FS
3307
.ret:
3351
.ret:
3308
        pop     eax
3352
        pop     eax
3309
        ret
3353
        ret
3310
@@:
3354
@@:
Line 3527... Line 3571...
3527
        mov     al, 11
3571
        mov     al, 11
3528
@@:
3572
@@:
3529
        ret
3573
        ret
Line 3530... Line 3574...
3530
 
3574
 
3531
fs_HdGetFileInfo:
3575
fs_HdGetFileInfo:
-
 
3576
        cmp     [fs_type], 1
-
 
3577
        jz      ntfs_HdGetFileInfo
-
 
3578
        cmp     [fs_type], 16
-
 
3579
        jz      @f
3532
        cmp     [fat_type], 0
3580
        cmp     [fs_type], 32
3533
        jnz     @f
3581
        jz      @f
3534
        mov     eax, ERROR_UNKNOWN_FS
3582
        mov     eax, ERROR_UNKNOWN_FS
3535
        ret
3583
        ret
3536
@@:
3584
@@:
3537
        cmp     byte [esi], 0
3585
        cmp     byte [esi], 0
Line 3551... Line 3599...
3551
@@:
3599
@@:
3552
        popfd
3600
        popfd
3553
        jmp     fs_GetFileInfo_finish
3601
        jmp     fs_GetFileInfo_finish
Line 3554... Line 3602...
3554
 
3602
 
3555
fs_HdSetFileInfo:
3603
fs_HdSetFileInfo:
-
 
3604
        cmp     [fs_type], 1
-
 
3605
        jz      ntfs_HdSetFileInfo
-
 
3606
        cmp     [fs_type], 16
-
 
3607
        jz      @f
3556
        cmp     [fat_type], 0
3608
        cmp     [fs_type], 32
3557
        jnz     @f
3609
        jz      @f
3558
        mov     eax, ERROR_UNKNOWN_FS
3610
        mov     eax, ERROR_UNKNOWN_FS
3559
        ret
3611
        ret
3560
@@:
3612
@@:
3561
        cmp     byte [esi], 0
3613
        cmp     byte [esi], 0
Line 3587... Line 3639...
3587
        call    update_disk
3639
        call    update_disk
3588
        pop     edi
3640
        pop     edi
3589
        xor     eax, eax
3641
        xor     eax, eax
3590
        ret
3642
        ret
Line -... Line 3643...
-
 
3643
 
-
 
3644
if 0    ; starting from revision 237 execute is implemented in taskman.inc
3591
 
3645
        ; through fs_XxxGetFileInfo and fs_XxxRead
3592
;----------------------------------------------------------------
3646
;----------------------------------------------------------------
3593
;
3647
;
3594
;  fs_HdExecute - LFN variant for executing from harddisk
3648
;  fs_HdExecute - LFN variant for executing from harddisk
3595
;
3649
;
Line 3706... Line 3760...
3706
        ret
3760
        ret
3707
.err:
3761
.err:
3708
        popad
3762
        popad
3709
        mov     eax, 11
3763
        mov     eax, 11
3710
        ret
3764
        ret
-
 
3765
end if
Line 3711... Line 3766...
3711
 
3766
 
3712
;----------------------------------------------------------------
3767
;----------------------------------------------------------------
3713
;
3768
;
3714
;  fs_HdDelete - delete file or empty folder from hard disk
3769
;  fs_HdDelete - delete file or empty folder from hard disk
Line 3717... Line 3772...
3717
;
3772
;
3718
;  ret  eax = 0 ok or other = errormsg
3773
;  ret  eax = 0 ok or other = errormsg
3719
;
3774
;
3720
;--------------------------------------------------------------
3775
;--------------------------------------------------------------
3721
fs_HdDelete:
3776
fs_HdDelete:
3722
        cmp     [fat_type], 0
3777
        cmp     [fs_type], 1
-
 
3778
        jz      ntfs_HdDelete
-
 
3779
        cmp     [fs_type], 16
-
 
3780
        jz      @f
-
 
3781
        cmp     [fs_type], 32
3723
        jnz     @f
3782
        jz      @f
3724
        push    ERROR_UNKNOWN_FS
3783
        push    ERROR_UNKNOWN_FS
3725
.pop_ret:
3784
.pop_ret:
3726
        pop     eax
3785
        pop     eax
3727
        ret
3786
        ret
3728
@@:
3787
@@: