แƒจแƒ”แƒชแƒ•แƒแƒšแƒ”แƒ— แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ

แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ•แƒ”แƒ‘ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒก, แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒแƒ› แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ˜แƒ แƒ” แƒแƒกแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ“แƒ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒคแƒแƒ แƒ›แƒแƒขแƒ˜.
แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒแƒฎแƒแƒšแƒ˜ แƒ–แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ แƒแƒกแƒ”แƒ•แƒ” แƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒ—แƒแƒ•แƒ˜แƒก แƒขแƒ™แƒ˜แƒ•แƒ˜แƒšแƒก. แƒแƒฅแƒ”แƒ“แƒแƒœ แƒ’แƒแƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒแƒ›แƒแƒชแƒแƒœแƒ:

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ

แƒ›แƒแƒ“แƒ˜แƒ— แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒแƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒ›แƒแƒœแƒแƒ—แƒ•แƒแƒšแƒ˜:

  • แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒคแƒ แƒ”แƒœแƒ˜แƒก แƒ“แƒ แƒแƒก, แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ“แƒ แƒแƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”;
  • แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒ—;
  • แƒ’แƒแƒ›แƒแƒ แƒ—แƒ”แƒ— แƒ“แƒแƒฃแƒ–แƒฃแƒกแƒขแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒคแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ.

แƒ›แƒ” แƒ’แƒแƒœแƒ•แƒ›แƒแƒ แƒขแƒแƒ• แƒ‘แƒแƒšแƒ แƒžแƒฃแƒœแƒฅแƒขแƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒแƒ“แƒœแƒแƒ• แƒ”แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒžแƒฃแƒœแƒฅแƒขแƒก. แƒ—แƒฃ แƒ แƒแƒ˜แƒ›แƒ” แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒแƒชแƒ˜แƒแƒก แƒ’แƒแƒ•แƒฎแƒแƒ“แƒ”แƒ— แƒฆแƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒกแƒแƒ˜แƒขแƒ–แƒ” แƒ—แƒแƒ•แƒ“แƒแƒกแƒฎแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ, แƒ“แƒ˜แƒ“แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ—แƒ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒ— แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒจแƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ”แƒก แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒšแƒแƒ‘แƒ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ˜แƒฎแƒฃแƒ แƒแƒก.

nginx แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ

แƒ–แƒ”แƒ›แƒแƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒญแƒ แƒ”แƒšแƒแƒ“ แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ nginx แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜:

  • ngx_http_image_filter_module - แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก;
  • ngx_http_proxy_module - แƒฅแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก;
  • ngx_http_secure_link_module โ€” แƒกแƒžแƒแƒ›แƒ˜แƒกแƒ’แƒแƒœ แƒ“แƒแƒกแƒแƒชแƒแƒ•แƒแƒ“;

แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜ ngx_http_image_filter_module ะธ ngx_http_secure_link_module แƒแƒ  แƒแƒ แƒ˜แƒก แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ”แƒขแƒแƒžแƒ–แƒ” nginx:

phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module

nginx แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒแƒฎแƒแƒšแƒก แƒฉแƒ•แƒ”แƒœแƒก แƒฐแƒแƒกแƒขแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก แƒกแƒแƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒฅแƒ”แƒจแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜:

...
    proxy_cache_path /www/myprojects/cache levels=1:2 keys_zone=image-preview:10m;
...
    server {
...
        location ~ ^/preview/([cir])/(.+) {
        # ะขะธะฟ ะพะฟะตั€ะฐั†ะธะธ
            set                         $oper $1;
        # ะŸะฐั€ะฐะผะตั‚ั€ั‹ ะธะทะพะฑั€ะฐะถะตะฝะธั ะธ ะฟัƒั‚ัŒ ะบ ั„ะฐะนะปัƒ
            set                         $remn $2;
        # ะŸั€ะพะบัะธั€ัƒะตะผ ะฝะฐ ะพั‚ะดะตะปัŒะฝั‹ะน ั…ะพัั‚
            proxy_pass                  http://myproject.ru:81/$oper/$remn;
            proxy_intercept_errors      on;
            error_page                  404 = /preview/404;
        # ะšะตัˆะธั€ะพะฒะฐะฝะธะต
            proxy_cache                 image-preview;
            proxy_cache_key             "$host$document_uri";
        # 200 ะพั‚ะฒะตั‚ั‹ ะบะตัˆะธั€ัƒะตะผ ะฝะฐ 1 ะดะตะฝัŒ
            proxy_cache_valid           200 1d;
        # ะพัั‚ะฐะปัŒะฝั‹ะต ะพั‚ะฒะตั‚ั‹ ะบะตัˆะธั€ัƒะตะผ ะฝะฐ 1 ะผะธะฝัƒั‚ัƒ
            proxy_cache_valid           any 1m;
        }
        
        # ะ’ะพะทะฒั€ะฐั‰ะฐะตะผ ะพัˆะธะฑะบัƒ
        location = /preview/404 {
            internal;
            default_type                image/gif;
            alias                       /www/myprojects/image/noimage.gif;
        }
...
    }
...

แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒแƒฎแƒแƒš แƒฐแƒแƒกแƒขแƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒจแƒ˜:

server {
    server_name                     myproject.ru;
    listen                          81;

    access_log                      /www/myproject.ru/logs/nginx.preview.access_log;
    error_log                       /www/myproject.ru/logs/nginx.preview.error_log info;

    # ะฃะบะฐะทั‹ะฒะฐะตะผ ัะตะบั€ะตั‚ะฝะพะต ัะปะพะฒะพ ะดะปั md5
    secure_link_secret              secret;

    # ะžัˆะธะฑะบะธ ะพั‚ะฟั€ะฐะฒะปัะตะผ ะพะฝะฐ ะพั‚ะดะตะปัŒะฝั‹ะน location
    error_page                      403 404 415 500 502 503 504 = @404;

    # location ะ”ะปั ั„ะธะปัŒั‚ั€ะฐ size
    location ~ ^/i/[^/]+/(.+) {
        
        # ะณั€ัะทะฝั‹ะน ั…ะฐะบ ะพั‚ ะ˜ะณะพั€ั ะกั‹ัะพะตะฒะฐ *
        alias                       /www/myproject.ru/images/$1;
        try_files                   "" @404;
    
        # ะŸั€ะพะฒะตั€ัะตะผ ะฟั€ะฐะฒะธะปัŒะฝะพัั‚ัŒ ััั‹ะปะบะธ ะธ md5
        if ($secure_link = "") { return 404; }
        
        # ะ˜ัะฟะพะปัŒะทัƒะตะผ ัะพะพั‚ะฒะตั‚ัะฒัƒัŽั‰ะธะน ั„ะธะปัŒั‚ั€
        image_filter                size;
    }

    # ะŸะพ ะฐะฝะฐะปะพะณะธะธ ะพัั‚ะฐะปัŒะฝั‹ะต location ะดะปั ะดั€ัƒะณะธั… ั„ะธะปัŒั‚ั€ะพะฒ
    location ~ ^/c/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;
        
        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;
    
        if ($secure_link = "") { return 404; }
    
        image_filter                crop  $width  $height;
    }
    
    location ~ ^/r/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;

        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;

        if ($secure_link = "") { return 404; }

        image_filter                resize  $width  $height;
    }

    location @404 { return 404; }
}

แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

  • myproject.ru/preview/i[md5]/[แƒ’แƒ–แƒ_แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก_แƒ™แƒ”แƒœ]
  • myproject.ru/preview/c[md5]/[แƒ–แƒแƒ›แƒ]/[แƒ’แƒ–แƒ_แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒกแƒ™แƒ”แƒœ]
  • myproject.ru/preview/r[md5]/[แƒ–แƒแƒ›แƒ]/[แƒ’แƒ–แƒ_แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒกแƒ™แƒ”แƒœ]

* try_files โ€” แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ แƒฃแƒกแƒฃแƒšแƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒ แƒ— แƒ›แƒ’แƒ แƒซแƒœแƒแƒ‘แƒ˜แƒแƒ แƒ”, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒงแƒแƒ•แƒแƒ แƒฏแƒœแƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒ˜แƒฌแƒ˜แƒ alias.

แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ•แƒ”แƒ‘ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜

แƒ•แƒ”แƒ‘ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒžแƒ แƒแƒชแƒ”แƒ“แƒฃแƒ แƒ (Perl):

sub proxy_image {
    use Digest::MD5     qw /md5_hex/;
    my %params = @_;
    my $filter = {
                    size    => 'i',
                    resize  => 'r',
                    crop    => 'c'            
                  }->{$params{filter}} || 'r';
    my $path = ($filter ne 'i' ?
                    ( $params{height} || '_' ) . 'x' . ( $params{width} || '_' ) . '/' :
                    ()
               ) . $params{source};
    my $md5 = md5_hex( $path . 'secret' );
    $path = '/preview/' . $filter . '/' . $md5 . '/' . $path;
    return $path;
}

my $preview_path = &proxy_image(
                    source  => 'image1.jpg',
                    height  => 100,
                    width   => 100,
                    filter  => 'resize'
                );

แƒ—แƒฃแƒ›แƒชแƒ แƒ›แƒ” แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒ–แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒแƒก แƒ”แƒกแƒ™แƒ˜แƒ–แƒ˜.

แƒ แƒแƒ™แƒ˜

แƒแƒ แƒ˜แƒ’แƒ˜แƒœแƒแƒšแƒฃแƒ แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒฌแƒแƒจแƒšแƒ˜แƒกแƒแƒก แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ แƒ˜ แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒ•แƒ”แƒ‘แƒ˜, แƒ‘แƒฃแƒœแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜แƒ, แƒแƒ  แƒฌแƒแƒ˜แƒจแƒšแƒ”แƒ‘แƒ แƒฅแƒ”แƒจแƒ˜แƒ“แƒแƒœ, แƒกแƒแƒœแƒแƒ› แƒฅแƒ”แƒจแƒ˜ แƒแƒ  แƒ’แƒแƒฃแƒฅแƒ›แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒ•แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ“แƒ”แƒก แƒฌแƒแƒจแƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ”แƒ แƒ—แƒ˜ แƒ“แƒฆแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ›แƒแƒฅแƒกแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ“แƒ แƒ.

แƒแƒ แƒ˜แƒ’แƒ˜แƒœแƒแƒšแƒ˜

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ