hunk.code_window:   customResolver = ^(NSDictionary *permission) {
       ABI34_0_0UM_ENSURE_STRONGIFY(self);
       // save results for permission
       permissions[permissionType] = [NSMutableDictionary dictionaryWithDictionary:permission];
  
hunk.labels: keep keep keep add keep
hunk.after_edit:     BOOL isGranted = [ABI34_0_0EXPermissions statusForPermissions:permission] == ABI34_0_0EXPermissionStatusGranted;
  
hunk.file_path: ios/versioned-react-native/ABI34_0_0/EXPermissions/ABI34_0_0EXPermissions/ABI34_0_0EXPermissions.m
hunk.type: add
file: import { EventEmitter } from '@unimodules/core';
  class GeocoderError extends Error {
      constructor() {
          super('Geocoder service is not available for this device.');
          this.code = 'E_NO_GEOCODER';
      }
  }
  const emitter = new EventEmitter({});
  function positionToJSON(position) {
      if (!position)
          return null;
      const { coords = {}, timestamp } = position;
      return {
          coords: {
              latitude: coords.latitude,
              longitude: coords.longitude,
              altitude: coords.altitude,
              accuracy: coords.accuracy,
              altitudeAccuracy: coords.altitudeAccuracy,
              heading: coords.heading,
              speed: coords.speed,
          },
          timestamp,
      };
  }
  export default {
      get name() {
          return 'ExpoLocation';
      },
      async getProviderStatusAsync() {
          return {
              locationServicesEnabled: 'geolocation' in navigator,
          };
      },
      async getCurrentPositionAsync(options) {
          return new Promise((resolve, reject) => navigator.geolocation.getCurrentPosition(position => resolve(positionToJSON(position)), reject, options));
      },
      async removeWatchAsync(watchId) {
          navigator.geolocation.clearWatch(watchId);
      },
      async watchDeviceHeading(headingId) {
          console.warn('Location.watchDeviceHeading: is not supported on web');
      },
      async hasServicesEnabledAsync() {
          return 'geolocation' in navigator;
      },
      async geocodeAsync() {
          throw new GeocoderError();
      },
      async reverseGeocodeAsync() {
          throw new GeocoderError();
      },
      async watchPositionImplAsync(watchId, options) {
          return new Promise(resolve => {
              // @ts-ignore
              watchId = global.navigator.geolocation.watchPosition(location => {
                  emitter.emit('Expo.locationChanged', { watchId, location: positionToJSON(location) });
              }, null, options);
              resolve(watchId);
          });
      },
      async requestPermissionsAsync() {
          return new Promise(resolve => {
              navigator.geolocation.getCurrentPosition(() => resolve({ status: 'granted' }), ({ code }) => {
                  if (code === 1 /* PERMISSION_DENIED */) {
                      resolve({ status: 'denied' });
                  }
                  else {
                      resolve({ status: 'undetermined' });
                  }
              });
          });
      },
  };
  //# sourceMappingURL=ExpoLocation.web.js.map